Özyineleme derinliği izleme

2 Cevap php

Bu belirsiz eğer benimle ayı; Ben tam (dolayısıyla neden yardım istemek için buradayım) bu başımı sarma sorun var.

Şöyle bir dizi var:

Array
(
[DimA1] => Array
    (
        [DimB1] => Array
            (
                [DimC1] => Array
                    (
                        [value1] => 13708
                        [value2] => 4.5
                    )

                [DimC2] => Array
                    (
                        [value1] => 1846
                        [value2] => 15.8
                    )

            )

        [DimB2] => Array
            (
                [DimC1] => Array
                    (
                        [value1] => 18166
                        [value2] => 6.4
                    )
            )
[DimA2] => Array
    (
        ....... etc

Ben bu diziye adım gerekiyor ve ben değer1 ve değer2 olsun, ben bazı veritabanı ekler yapmak gerekir. Zaman içinde bu noktada, ben şu anda adım attı ediyorum hangi diziler sadece farkında olmak ve benim veritabanı ekler parçası olarak kendi anahtar adını kullanmak gerekir.

Benim geçerli çözüm bu gibi görünüyor:

public function recurseCounts($array,$dims = array()) {
	foreach ($array as $key => $value) {
		$dims[] = $key;
		if (isset($value['value1']) || isset($value['value2'])) {
			print_r($value); // For debugging...
			print_r($dims); // For debugging...
                            // DB Logic to insert dimensions in to DB here
                            // DB Logic to insert values in to DB here
			array_pop($dims);
		} else {
			$this->recurseCounts($value,$dims);
		}
	}
}

Bu döngü, DimB2 vurur şeyler kaçık başlar nerede o noktaya kadar çalışır.

Bu çözmek konusunda herhangi bir fikir?

2 Cevap

Her zaman $ söndükten ekliyoruz.

$ Boyutlar şimdi gidecek:

DimA1
DimA1, DimB1
DimA1, DimB1, DimC1
DimA1, DimB1, DimC2
DimA1, DimB1, DimB2
DimA1, DimB1, DimB2, DimC1
DimA1, DimB1, DimB2, DimC2

Eğer dışarıya array_pop taşırsanız Tamam olmalıdır eğer.

public function recurseCounts($array,$dims = array()) {
    foreach ($array as $key => $value) {
            $dims[] = $key;
            if (isset($value['value1']) || isset($value['value2'])) {
                    print_r($value); // For debugging...
                    print_r($dims); // For debugging...
                        // DB Logic to insert dimensions in to DB here
                        // DB Logic to insert values in to DB here
            } else {
                    $this->recurseCounts($value,$dims);
            }
            array_pop($dims);
    }

}

Eğer derinlemesine "C" aynı anda tuşlar beri elemanlarına tam yolunu takip etmek gerekir:

public function recurseCounts($array,$dims = array(),$path = '') {
        foreach ($array as $key => $value) {
                $dims[] = ($path ? $Path.'_' : '').$key; // Add the full path (separated by '_')
                if (isset($value['value1']) || isset($value['value2'])) {
                        print_r($value); // For debugging...
                        print_r($dims); // For debugging...
                            // DB Logic to insert dimensions in to DB here
                            // DB Logic to insert values in to DB here
                        array_pop($dims);
                } else {
                        $this->recurseCounts($value,$dims,end($depth)); // pass it on
                }
        }
}