【问题标题】:PHP array_merge_recursive with foreach loopPHP array_merge_recursive 与 foreach 循环
【发布时间】:2017-08-12 19:06:42
【问题描述】:

如何将数组循环合并为单个数组(可能是对象),并将每个值添加到其关联的公共键中?

Categories: 

Array ( [category] => introduction [timeZone] => Europe/Stockholm [language] => Danish )

Array ( [category] => introduction [timeZone] => Europe/Stockholm [language] => Danish )

Array ( [category] => e-learning [timeZone] => Europe/Stockholm [language] => German )

进入

Collection

Array ( 
        [category] => Array (e-learning,introduction) 
        [timeZone] => Europe/Stockholm 
        [language] => Array (Danish,German)
)

到目前为止我的代码:

foreach ($categories as $category){
   $collection = array_merge_recursive($category);
}

如果我在 PHP 中指定了 $array1,$array2,那么 array_merge_recursive 似乎可以实现我的结果。但我需要从 foreach 循环中执行。

谢谢。

【问题讨论】:

    标签: php arrays foreach


    【解决方案1】:

    给定名为 $categories 的初始数组,考虑:

    $collection = array_merge_recursive(...$categories);
    foreach($collection as &$item) $item = array_unique($item);
    

    输出:

    [
      'category' => ['intro','learning'],
      'timezone' => ['Europe'],
      'language' => ['Danish','German'],
    ]
    

    Live demo

    【讨论】:

    • 谢谢!这正是我所追求的。但问题是,为什么'foreach($collection as &$item) $item = array_unique($item);'因为这也适用于“array_unique($collection)”。只是出于兴趣,因为两者都返回相同的结果
    • @Elliott 我在$collection 的每个成员上调用array_unique(),因为您希望每个子数组都有唯一的值。否则,如果您合并的数组在它们的category 子数组中都有一个intro 值,那么您最终可能会得到'category'=>['intro','intro']
    【解决方案2】:

    我想这个棘手的解决方案:

    $collection = [];
    // get keys of a first element of categories
    $keys = array_keys($categories[0]);
    // iterate over these keys
    foreach ($keys as $key) {
        // use `array_unique` to eliminate duplicates
        $collection[] = array_unique(
            // `array_column` will give you all values under `$key`
            array_column($categories, $key)
        );
    }
    

    当然,这从 php5.5 开始有效,因为在这个版本中我们有 array_column

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 2016-09-26
      • 2012-07-19
      • 2015-12-10
      • 1970-01-01
      • 2014-03-15
      相关资源
      最近更新 更多