【问题标题】:PHP merge arrays by valuePHP 按值合并数组
【发布时间】:2011-12-19 21:49:34
【问题描述】:

我知道这很容易通过foreachwhile->list 等程序来完成(我已经完成了),但是我觉得我的代码有点脏而且它没有t 看起来像是最好的解决方案......我正在寻找使用原生 PHP 数组函数来执行以下操作:

我有两个如下所示的数组:

[0](数组)#2 [等级]“579” [id]“1” [1](数组)#4 [排名]“251” [id]“2” [0](数组)#2 [尺寸]"S" [状态]“A” [id]“1” [1](数组)#15 [尺寸]"L" [状态]“A” [id]“2”

因此我需要类似以下内容:

[0](数组)#2 [尺寸]"S" [状态]“A” [id]“1” [等级]“579” [1](数组)#2 [尺寸]"L" [状态]“A” [id]“2” [排名]“251”

有没有一种方法可以合并两个具有id 值(或其他任何值)的数组,而无需进入无穷无尽的foreachs 集合?

【问题讨论】:

  • 两个数组中相同索引处的元素是否相同?换句话说,如果 id 为 5 的元素在第一个数组的索引 3 处,它是否也会在第二个数组的索引 3 处?

标签: php arrays merge


【解决方案1】:

使用array_merge_recursive()

$array = array_merge_recursive($array1, $array2);

或制作自己的函数(可能更快)

function my_array_merge(&$array1, &$array2) {
    $result = Array();
    foreach($array1 as $key => &$value) {
        $result[$key] = array_merge($value, $array2[$key]);
    }
    return $result;
}
$array = my_array_merge($array1, array2);
print_r($array);

【讨论】:

  • 太棒了!,谢谢你,仅供参考:只要您需要丢弃那些在两个数组上不重复的记录,函数方法就非常有效。
  • 这在技术上并不能回答这个问题。 @OsvaldoM。希望根据 id 的值加入,而不是通过键。
【解决方案2】:

正如雷在评论中注意到的那样,接受的答案实际上并没有回答问题。我找不到答案,所以我创建了以下小实用函数:

function array_merge_callback($array1, $array2, $predicate) {
    $result = array();

    foreach ($array1 as $item1) {
        foreach ($array2 as $item2) {
            if ($predicate($item1, $item2)) {
                $result[] = array_merge($item1, $item2);
            }
        }
    }

    return $result;
}

如下使用:

array_merge_callback($array1, $array2, function ($item1, $item2) {
    return $item1['id'] == $item2['id'];
});

【讨论】:

  • 更有用..太棒了:)
【解决方案3】:

像其他语言一样合并数组是一个不错的选择。 这是因为php具有自动编号的数组元素,合并会通过键复制或替换不同的元素。

现在变了。

// array_fork
  public static function array_fork() {
    $args = func_get_args();
    $result = array();
    foreach ($args as $arr) {
      is_array($arr) || exit('[' . __METHOD__ . '] Each item must be an array.');
      foreach ($arr as $key => $val) {
        if (is_array($val)) {
          // recursion
          !isset($result[$key]) && $result[$key] = array();
          $result[$key] = self::array_fork($result[$key], $arr[$key]);
          continue;
        }
        if (is_numeric($key)) {
          if (!in_array($arr[$key], $result))
            $result[] = $arr[$key];
        } else
          $result[$key] = $arr[$key];
      }
    }
    return $result;
  }

【讨论】:

    【解决方案4】:
    function custom_array_merge(&$array1, &$array2) {
        $result = Array();
        foreach ($array1 as $key_1 => &$value_1) {
            // if($value['name'])
            foreach ($array2 as $key_1 => $value_2) {
                if($value_1['name'] ==  $value_2['name']) {
                    $result[] = array_merge($value_1,$value_2);
                }
            }
    
        }
        return $result;
    }
    

    // 传递 $array1, &$array2 并更改 $value_2['name'] // 根据您要合并的名称。

    【讨论】:

      【解决方案5】:

      好的,假设你的数组被称为 $arr1 和 $arr2,你可以这样做:

      <?php
      $newarray = Array();
      foreach ($arr1 as $element=>$value){
          $newarray = array_merge($arr1[$element],$arr2[$element])
      }
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 2011-11-25
        • 2022-11-20
        • 1970-01-01
        • 2015-09-19
        相关资源
        最近更新 更多