从包含数组类型数据的数组列创建值的平面数组

Create a flat array of values from an array column containing array-type data

我在 PHP 中有这个数组。

$all = array(
array(
    'titulo' => 'Nome 1',
    'itens' => array( 'item1', 'item2', 'item3')
),
array(
    'titulo' => 'Nome 2',
    'itens' => array( 'item4', 'item5', 'item6')
),
array(
    'titulo' => 'Nome 4',
    'itens' => array( 'item7', 'item8', 'item9')
));

我需要合并特定的子数组。换句话说,我需要获取 itens 数据列(其中包含数组类型数据)作为平面结果数组,如下所示:

$filteredArray = array('item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9');

我可以使用 foreach() 来做到这一点,但是还有其他更优雅的方法吗?

使用循环和array_merge:

$filteredArray = array();
foreach ($all as $array) {
   $filteredArray = array_merge($filteredArray, $array['itens']);
}
print_r($filteredArray);

您可以遍历数组并加入它们:

$filteredArray = array();

foreach($all as $items) {
    foreach($items["itens"] as $item) {
        array_push($filteredArray, $item);
    }
}

您可以减少数组的 itens 列,使用 array_merge 作为回调。

$filteredArray = array_reduce(array_column($all, 'itens'), 'array_merge', []);

或者更好的是,通过使用 "splat" operator 将列直接解包到 array_merge.

来消除 array_reduce
$result = array_merge(...array_column($all, 'itens'));
function array_flatten($array) {
  if (!is_array($array)) {
    return false;
  }
  $result = array();
  foreach ($array as $key => $value) {
    if (is_array($value)) {
      $result = array_merge($result, array_flatten($value));
    } else {
      $result[$key] = $value;
    }
  }
  return $result;
}

另一个未提及的技术是迭代输入数组并将可变数量的元素推入输出数组。

代码:(Demo)

$result = [];
foreach ($all as $row) {
    array_push($result, ...$row['itens']);
}
var_export($result);

输出:

array (
  0 => 'item1',
  1 => 'item2',
  2 => 'item3',
  3 => 'item4',
  4 => 'item5',
  5 => 'item6',
  6 => 'item7',
  7 => 'item8',
  8 => 'item9',
)