php получает элемент массива по позиции вместо числового ключа

У меня есть сценарий, который сортирует ввод с учетом родительских и дочерних отношений и заданного порядка отображения каждого. Упрощенный массив может выглядеть так (реальный массив также имеет дочерние массивы)

$output = Array
(
[7] => first array
[3] => second array
[1] => last array
)

В котором ключи являются соответствующими идентификаторами ввода. Теперь я хочу пройти через этот массив сверху вниз в while петля. Я не пользуюсь foreach потому что, если у него есть дочерние элементы, несколько элементов должны обрабатываться вместе, а не возвращаться в следующем «цикле».

function recursive_func($array){
while ($i<=count($array)){
if (isset($array[$i]['children'])){
?><div><?php
recursive_function($array[$i]['children']);
$i++;
recursive_function($array[$i]['children']);
$i++;
?></div><?php
}
else{
?><div>Something</div><?php
$i++;
}
}
}

очевидно $array[$i]['children'] не дочерние элементы i-го элемента (по позиции), а ключа со значением i.
Как я могу пройти через этот массив в порядке, как в $output?

0

Решение

Как Гарр Годфри предложил, Вы можете решить это с array_keys() вот так

function recursive_func($array){
$keys = array_keys($array);
for ($i=0; $i<count($keys); $i++) {
if (isset($array[ $keys[$i] ]['children'])) {
recursive_func($array[ $keys[$i] ]['children']);
$i++;
recursive_func($array[ $keys[$i] ]['children']);
} else {
//sth, no $i++ here!
}
}
}

Потому что я использую for цикл здесь, $i++ внутри цикла позволит вам пропустить один элемент

0

Другие решения

Вы можете использовать array_keys, чтобы получить ключи в отсортированном порядке и перебрать их.
Или также можете использовать array_values, тогда вы можете индексировать последовательно. Просто сделай это прямо в начале.

function recursivefunction( $array ) {
$array = array_values($array);
....
}

Я не уверен, почему одна запись, имеющая детей, означает, что и другая делает то же самое, но я предполагаю, что foreach проблематичен.

1

Так как ключи $ output расположены не по порядку, можно сделать следующее:

Сначала получите все ключи массива:

$keys=array_keys($output);

Далее вы можете вызвать recursive_func ($ keys, $ output):

function recursive_func($keys,$output){
$size=count($keys);
$i=0;
while ($i<=$size){
if (isset($output[$i]['children'])){
?><div><?php
$a=$output[$i]['children'];
recursive_function(array_keys($a),$a);
$i++;
$a=$output[$i]['children'];
recursive_function(array_keys($a),$a);
$i++;
?></div><?php
}
else{
?><div>Something</div><?php
$i++;
}
}
}

Обратите внимание, что для большей производительности лучше установить размер $ массива вне цикла

1
По вопросам рекламы [email protected]