遍历多维数组,其中某些数组可能没有元素

时间:2018-10-23 19:49:16

标签: php arrays multidimensional-array foreach

我有一个$ products数组,如下所示:

Array
(
    [0] => Array
        (
            [0] => 1001
            [1] => 1002
        )

    [1] => 
    [2] => 
    [3] => 
    [4] => 
    [5] => 
    [6] => 
    [7] => 
)

我想遍历它,并创建一个仅包含非空数组数据的一级数组,如下所示:

$newArr = [
    [0] => 1001,
    [1] => 1002
]

我认为可以工作的foreach循环抛出错误('Invalid argument supplied for foreach()')。

foreach循环如下:

$idArr = [];
foreach($products as $value) {
    foreach ($value as $id) {
        echo $id . '<br>';
        $idArr[] = $id;
    }
}

这两个值回显表明代码正确,但事实并非如此。我无法将迭代的$ id值存储到$idArr[]中。

如果任何人都能发现我的一个或多个错误,我将不胜感激。

谢谢!

4 个答案:

答案 0 :(得分:1)

您不需要太多更改代码,如果没有价值,您可以跳过内部循环。

$idArr = [];
foreach($products as $value) {
    if (!$value) continue;   // continue to next iteration without executing the inner loop
    foreach ($value as $id) {
        $idArr[] = $id;
    }
}

或将内部循环括在if ($value) ...块中。但是,只要您不尝试迭代不存在的数组,就可以。

答案 1 :(得分:0)

<?php
$arrayTest = [
        'country' => [
            'Russian Federation' => [
                'Region' => [
                    'Moscow',
                    'Moscow',
                    'Moscow'
                ],
                'Moscow', 
                'Moscow', 
                'Moscow'
            ],
            "United States of America" => [
                'Moscow', 
                'Moscow', 
                'Moscow'
            ],
            "China" => [
                'Moscow', 
                'Moscow', 
                'Moscow'
            ]
        ],

        'union' => [
            'Moscow', 
            'Moscow'
        ], 

        'status' => 1, 

        'age' => 34
    ];

$result = [];
array_walk_recursive($arrayTest, function ($item, $key) use (&$result) {
    $result[] = $item;    
});
print_r($result);
?>

答案 2 :(得分:0)

$idArr = array();
foreach($products as $value) {
    if(is_array($value)){
        foreach ($value as $id) {
                $idArr[] = $id;
         }
      }
 }

答案 3 :(得分:0)

您可以使用PHP Spl RecursiveIteratorIterator

$array = array(1,2,array(3,4, array(5,6,7), 8),[0=>1, 1=> [0=>null]], 9);
$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($a));
foreach($it as $v) {
  echo $v, " ";
}

打印

1 2 3 4 5 6 7 8 1 9

reference已修改为适合您的示例