【问题标题】:array_diff() based on one column between two arrays with associative rows [duplicate]array_diff() 基于具有关联行的两个数组之间的一列[重复]
【发布时间】:2022-02-09 20:22:08
【问题描述】:

我有两个多维数组,它们是关联行的索引数组。

$array1 = array(
    array('name' => 'foo', 'id' => 12),
    array('name' => 'bar', 'id' => 34),
    array('name' => 'boo', 'id' => 56),
);

$array2 = array(
    array('name' => 'bar', 'id' => 34),
    array('name' => 'boo', 'id' => 56),
    array('name' => 'bar', 'id' => 78),
);

行可能有不同的id 值但相同的name 值——例如我的示例输入数据中的bar

我只需要比较基于 id 值的数组。

预期输出:(因为 ids 3456$array2 中找到)

array(
    array('name' => 'foo', 'id' => 12)
)

我试过$one_not_two = array_diff($array1['id'], $array2['id']); 没有返回任何东西。

我也试过$one_not_two = array_diff($array1['id'], $array2['id']);
返回错误“参数不是数组。”

最初,我通过将ids 提取到一维数组中来解决它,然后只比较它们。现在,我们应用程序中的一个新功能要求我在保持多维结构的同时比较行。有什么建议吗?

如果这有什么不同的话,我们的服务器目前正在运行 php 5.3。

【问题讨论】:

    标签: php multidimensional-array filtering associative-array array-difference


    【解决方案1】:

    因为数组是多维的,你必须像这样提取 id:

    $ids1 = array();
    foreach($array1 as $elem1)
        $ids1[] = $elem1['id'];
    
    $ids2 = array();
    foreach($array2 as $elem2)
        $ids2[] = $elem2['id'];
    
    $one_not_two = array_diff($ids1,$ids2);
    

    对于您的具体问题,请查看array_diff() with multidimensional arrays

    【讨论】:

    • 谢谢,但我在问题中提到我已经尝试过类似的东西。这将是一个简单的解决方案,但脚本的其余部分需要 $one_not_two 包含映射名称 => id。
    • 那你应该看看这个问题:stackoverflow.com/questions/11821680/…
    • 将您的评论添加到答案中
    【解决方案2】:

    您可以使用array_udiff 创建自定义差异函数:

    $diff = array_udiff($array1,
                        $array2,
                        function ($a, $b){
                            if($a['id'] == $b['id']){
                                return 0;
                            } else {
                                return ($a['id'] < $b['id'] ? -1 : 1);
                            }
                        }
                    );
    

    http://codepad.viper-7.com/2u5EWg

    【讨论】:

      【解决方案3】:

      如果 id 是唯一的,您可以这样做:

      $one_not_two = array();
      
      foreach ($array1 as $val) {
          $one_not_two[$val['id']] = $val;
      }
      
      foreach ($array1 as $val) {
          if (!isset($one_not_two[$val['id']])) {
              $one_not_two[$val['id']] = $val;
      }
      

      【讨论】:

        【解决方案4】:

        最后我通过将 Array1 更改为 name =&gt; id 的关联数组来解决它

        【讨论】:

          【解决方案5】:

          和你有同样的问题。

          已解决:$result = array_diff_assoc($array2, $array1);

          参考:PHP: array_diff_assoc

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-04-18
            • 1970-01-01
            • 1970-01-01
            • 2015-03-21
            • 1970-01-01
            • 2020-10-13
            • 1970-01-01
            相关资源
            最近更新 更多