Глубина отслеживания в рекурсии - PullRequest
2 голосов
/ 11 мая 2009

Потерпи меня, если это неясно; У меня проблемы с тем, чтобы полностью обернуть голову вокруг этого (следовательно, поэтому я здесь, чтобы попросить о помощи).

У меня есть массив, который выглядит так:

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

Мне нужно пройти через этот массив, и когда я доберусь до значения1 и значения2, мне нужно будет выполнить некоторые вставки в базу данных. На данный момент мне нужно знать, через какие массивы я сейчас вхожу, и использовать их имя ключа как часть моих вставок в базу данных.

Мое текущее решение выглядит так:

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);
        }
    }
}

Это работает до тех пор, пока цикл не достигнет DimB2, вот тогда все начинает становиться странным.

Есть идеи, как это решить?

Ответы [ 2 ]

2 голосов
/ 11 мая 2009

Вы всегда добавляете к $ dims.

Теперь $ dims будет идти:

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

Если вы переместите array_pop за пределы, если вы должны быть в порядке.

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);
    }

}

1 голос
/ 11 мая 2009

Вам необходимо отслеживать полный путь к элементам, поскольку клавиши на глубине "C" одинаковы:

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
                }
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...