Сохранять данные столбца из многомерного массива, сохраняя при этом отсутствующие элементы

У меня есть массив ($myArray) который выглядит как

Array ( [0] => 
   Array ( [0] => 
      Array ( 
         [Date] => 1776-08-08
         [Color] => Yellow 
         [Description] => Rotten
       ) ) 

    [1] => Array ( ) 
    [2] => 
     Array ([0] =>
      Array ( 
       [Date] => 2018-05-13 
       [Color] => Red 
       [Status] => Fresh 
      ) 
         [1] => 
      Array ( 
       [Date] => 1991-03-29
       [Color] => Green 
       [Status] => Fresh  ) )

Я перебираю содержимое значений Date, используя

array_walk_recursive($myArray, function($v, $k){
  if ($k == "Date") echo $v . PHP_EOL;

Это даст мне правильный вывод.

1776-08-08 2018-05-13 1991-03-29

Я хочу добавить выходные данные в массив и даже если значение равно нулю (т.е. [1] выше), чтобы по-прежнему установить пустой массив.

Например, $newArray =

Array ( [0] => 1776-08-08 )

Array ( )
Array ( [0] => 2018-05-13 [1] => 1991-03-29 )

2 ответа

Учитывая ваш пример, вариант заключается в использовании array_column() на каждом из элементов в самом внешнем массиве, что легко с array_map() функция.

$input = array(
    array(
        array(
            "Date" => "1776-08-08",
            "Color" => "Yellow",
            "Description" => "Rotten",
        ),
    ),
    array(
    ),
    array(
        array(
            "Date" => "2018-05-13",
            "Color" => "Red",
            "Status" => "Fresh",
        ),
        array(
            "Date" => "1991-03-29",
            "Color" => "Green",
            "Status" => "Fresh",
        ),
    ),
);

$output = array_map(function($sub_arrays) {
    return array_column($sub_arrays, "Date");
}, $input);

print_r($output);

Выше будет выводить что-то вроде:

Array
(
    [0] => Array
        (
            [0] => 1776-08-08
        )

    [1] => Array
        (
        )

    [2] => Array
        (
            [0] => 2018-05-13
            [1] => 1991-03-29
        )

)

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

$newArray = array();
foreach ($myArray as $el) {
    $temp = array();
    array_walk_recursive($el, function($v, $k) use (&$temp) {
            if ($k == "Date") {
                $temp[] = $v;
            }
        });
    $newArray[] = $temp;
}

DEMO

Другие вопросы по тегам