php按位置而不是数字键获取数组元素

时间:2016-03-20 21:11:31

标签: php arrays position key

我有一个脚本,它根据父子关系和每个的给定显示顺序对输入进行排序。简化的数组看起来像这样(实际的数组也有子数组)

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

其中键是输入的对应id。现在我想在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中的顺序传递此数组?

3 个答案:

答案 0 :(得分:1)

您可以使用array_keys按排序顺序获取密钥,并迭代这些密钥。 或者也可以使用array_values,然后你可以顺序索引。一开始就做好。

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

我不确定为什么一个有孩子的条目意味着下一个也是如此,但我认为foreach是有问题的。

答案 1 :(得分: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++;
        }
   }
}

请注意,最好在循环外设置数组的$ size以获得更好的性能

答案 2 :(得分:0)

作为Garr Godfrey suggested,您可以使用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++将使您可以跳过一个元素