Итерация по многомерному массиву, где некоторые массивы могут не иметь элементов - PullRequest
0 голосов
/ 23 октября 2018

У меня есть массив $ 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 голосов
/ 23 октября 2018

Вам не нужно сильно менять свой код, вы можете просто пропустить внутренний цикл, если его значение отсутствует.

$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) ....Как вам угодно, если вы не пытаетесь перебирать массивы, которых там нет.

0 голосов
/ 23 октября 2018
$idArr = array();
foreach($products as $value) {
    if(is_array($value)){
        foreach ($value as $id) {
                $idArr[] = $id;
         }
      }
 }
0 голосов
/ 23 октября 2018

Вы можете использовать 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

ссылка изменена в соответствии с вашим примером

0 голосов
/ 23 октября 2018
<?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);
?>
...