【问题标题】:If array exists in array - multidimensional associative array如果数组中存在数组 - 多维关联数组
【发布时间】:2020-03-23 00:06:50
【问题描述】:

我有两个多维数组。我想检查数组 1 中的每个项目,看看它是否在数组 2 中,反之亦然。

例如:

$arr1 = [
    [
        id => '1',
        order => '123238'
    ],
    [
        id => '2',
        order => '33278'
    ],
    [
        id => '3',
        order => '8892372'
    ]
];

$arr2 = [
    [
        id => '1',
        order => '349483'
    ],
    [
        id => '2',
        order => '9837283'
    ],
    [
        id => '3',
        order => '33278'
    ]
];

我想通过order查看。

所以是这样的:

if($arr1['order'] does not exist in $arr2['order']) {
    echo 'abc';
}

if($arr2['order'] does not exist in $arr1['order']) {
    echo 'xyz';
}

我考虑过为两者都做foreach 循环,但它不会让我知道arr # 它丢失了。

我怎样才能做到这一点?

【问题讨论】:

  • 使用 in_array() 函数它应该适合你。
  • 一种方法是:将两个数组映射到它们的顺序,然后使用array_diff计算两者之间的差异。
  • 如果 id 不同,in_array 会起作用吗?
  • 另外,请注意,您不应使用假定的字符串作为数组索引。
  • 您可能应该在定义数组的idorder 中添加一些引号。

标签: php arrays object multidimensional-array associative-array


【解决方案1】:

您可以通过使用array_columnarray_intersect_key 来处理这种情况

 $arr1 = array_column($arr1, null , 'order');
 $arr2 = array_column($arr2, null , 'order');
 print_r(array_intersect_key($arr1,$arr2));

示例:- https://3v4l.org/Imbao

【讨论】:

  • 你如何获得arr1 中但不在arr2 中的那些,反之亦然?
  • 是的,这是可行的,但请查看:3v4l.org/dWvMoarr2 不再是关联数组。我现在如何比较?
  • @TimmyBalk 查看更多详情:3v4l.org/nTtpL
  • 好的,谢谢,但是这个呢? 3v4l.org/dWvMo 我怎样才能让它工作? $arr2 只是常规数组,而不是关联数组。我只需要它来工作
  • @TimmyBalk 在第二种情况下你可以像这样使用3v4l.org/f2Ga5, 3v4l.org/hRvm8
【解决方案2】:

试试这样的:

for ($i = 0; $i < 3; $i++) {
      for ($j = 0; $j < 3; $j++) {
            if (!in_array($arr1[$i]['order'], $arr2[$j])) {
                  echo "abc ";
            }
      }
}

它基本上检查arr1 中的每个order 是否已经存在于$arr2 中,如果它不存在,你会得到一个abc 作为输出。

因此你会得到这个作为输出:

abc abc abc abc abc abc abc abc abc



这里还有一个带有foreach的版本:

foreach ($arr1 as $arrone){
      foreach ($arr2 as $arrtwo) {
            if (!in_array($arrone['order'], $arrtwo)) {
                  echo "abc ";
            }
      }
}

【讨论】:

  • foreach也可以这样做对吧?
  • 可能。给我一秒钟,我会尝试这样做
  • @TimmyBalk 我编辑了我的答案,现在也有foreach 的答案
【解决方案3】:

忽略您的 id,从您的第二个数组构建一个订单号列表,然后遍历您的初始数组以检查订单号是否不包含在其中:

数据:

$arr1 = [
    [
        id => '1',
        order => '123238'
    ],
    [
        id => '2',
        order => '33278'
    ],
    [
        id => '3',
        order => '8892372'
    ]
];

$arr2 = [
    [
        id => '1',
        order => '349483'
    ],
    [
        id => '2',
        order => '9837283'
    ],
    [
        id => '3',
        order => '33278'
    ]
];

方法:

foreach($arr2 as $item)
    $orders2[] = $item['order'];

foreach($arr1 as $item)
    if(!in_array($item['order'], $orders2))
        echo $item['order'], " order number is not contained\n";

输出:

123238 order number is not contained
8892372 order number is not contained

【讨论】:

    【解决方案4】:

    您可以使用array_uintersectarray_udiff 根据order 键的值来查找每个数组中相同或不同的值:

    // values in both $arr1 and $arr2
    print_r(array_uintersect($arr1, $arr2, function ($a, $b) { return $a['order'] - $b['order']; }));
    // values in $arr1 but not $arr2
    print_r(array_udiff($arr1, $arr2, function ($a, $b) { return $a['order'] - $b['order']; }));
    // values in $arr2 but not $arr1
    print_r(array_udiff($arr1, $arr2, function ($a, $b) { return $a['order'] - $b['order']; }));
    

    输出:

    Array
    (
        [1] => Array
            (
                [id] => 2
                [order] => 33278
            )
    
    )
    
    Array
    (
        [0] => Array
            (
                [id] => 1
                [order] => 123238
            )
        [2] => Array
            (
                [id] => 3
                [order] => 8892372
            )
    )
    
    Array
    (
        [0] => Array
            (
                [id] => 1
                [order] => 123238
            )
        [2] => Array
            (
                [id] => 3
                [order] => 8892372
            )
    )
    

    Demo on 3v4l.org

    【讨论】:

    • 谢谢,但是否也可以显示id 列?
    • @TimmyBalk 当然 - 但如果 id 值不同,即使 order 值相同,是否仍应计为相同值?
    • 它应该算作不同的值,但仍然显示两者。还有这在编程中叫什么?
    • 所以为了清楚起见,对于您的示例数据,$arr1$arr2 之间会有 no 匹配值?
    • @TimmyBalk 为无线电沉默道歉……不得不睡觉。根据您接受的答案,我认为这可能是实现所需结果的更简单方法。
    【解决方案5】:

    您可以使用 array_uintersect 和自定义回调函数来检查值或使用 order 来获取所有交叉点。

    $intersect = array_uintersect($arr1, $arr2, function ($a, $b) {
        return strcmp($a['order'], $b['order']);
    });
    
    print_r($intersect);
    
    $notInArr1 = array_uintersect($arr1, $arr2, function ($a, $b) {
        if ($a["order"] === $b["order"]) return -1;
        if ($a["order"] > $b["order"]) return 1;
        return 0;
    });
    
    print_r($notInArr1);
    
    $notInArr2 = array_uintersect($arr2, $arr1, function ($a, $b) {
        if ($a["order"] === $b["order"]) return -1;
        if ($a["order"] > $b["order"]) return 1;
        return 0;
    });
    
    print_r($notInArr2);
    

    php demo

    输出

    Array
    (
        [1] => Array
            (
                [id] => 2
                [order] => 33278
            )
    
    )
    Array
    (
        [0] => Array
            (
                [id] => 1
                [order] => 123238
            )
    
        [2] => Array
            (
                [id] => 3
                [order] => 8892372
            )
    
    )
    Array
    (
        [0] => Array
            (
                [id] => 1
                [order] => 349483
            )
    
        [1] => Array
            (
                [id] => 2
                [order] => 9837283
            )
    
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 2021-02-21
      相关资源
      最近更新 更多