如果在另一个平面数组中找到属性值,则从对象数组中删除对象

问题描述 投票:0回答:5

我有 2 个 PHP 数组,一个简单的:

array
  0 => int 5
  1 => int 6

和一个对象数组:

array
  0 => 
    object(stdClass)[43]
      public 'id' => int 1
  1 => 
    object(stdClass)[46]
      public 'id' => int 3
  2 => 
    object(stdClass)[43]
      public 'id' => int 5
  3 => 
    object(stdClass)[46]
      public 'id' => int 6
  4 => 
    object(stdClass)[46]
      public 'id' => int 7

我想对这两个数组进行比较,以消除第二个数组中存在的第一个数组。在此示例中,我不希望第二个数组中包含 id 5 和 6。

php arrays filter diff array-difference
5个回答
3
投票

假设

$objects
是您的对象数组,
$values
是您要删除的值数组...

如果你想返回对象,可以使用

foreach
循环:

$values = array(5, 6);
$objects = array(
    (object) array("id" => 1),
    (object) array("id" => 3),
    (object) array("id" => 5),
    (object) array("id" => 6),
    (object) array("id" => 7)
);
foreach($objects as $key => $object) {
    if(in_array($object->id,$values)) {
        unset($objects[$key]);
    }
}

现场演示(0.008秒)

如果你想使用

diff
函数本身(这是可能的,但很尴尬,可读性较差,并且只会返回一个值数组),你可以(正如 Baba 建议的那样)内联返回对象的
id

$values = array(5, 6);
$objects = array(
    (object) array("id" => 1),
    (object) array("id" => 3),
    (object) array("id" => 5),
    (object) array("id" => 6),
    (object) array("id" => 7)
);
$diff = array_diff(array_map(function ($object) {
    return $object->id;
}, $objects), $values);

现场演示(0.008秒)


3
投票

你可以尝试一下:

$diff = array_diff(array_map(function ($v) {
    return $v->id;
}, $array2), $array1);

查看现场演示


2
投票

循环第二个数组并使用

in_array
方法检查第一个

中是否存在值
$firstArray = array(5, 6);
foreach ($objects as $key => $object) {
    if (in_array($object->id, $firstArray)) {
        unset($objects[$key];
    }
}

1
投票

对于 5.3 之前的版本

 foreach( $arr_2nd as $key => $val  )
{
   $arr_2nd[$key] = $val->id;
}

array_diff( $arr_1st, $arr_2nd );

0
投票

PHP 有一个原生函数来处理这个过滤任务,无需任何特殊的数据准备。 在回调中,未知

$a
$b
值是否来自第一个或第二个数组。 因此,首先检查变量是否是具有
id
属性的对象,如果是则使用该变量,否则使用非对象值。 演示

$blacklist = [5, 6];
$objects = [
    (object)["id" => 1],
    (object)["id" => 3],
    (object)["id" => 5],
    (object)["id" => 6],
    (object)["id" => 7]
];

var_export(
    array_udiff(
        $objects,
        $blacklist,
        fn($a, $b) => ($a->id ?? $a) <=> ($b->id ?? $b)
    )
);

输出:

array (
  0 => 
  (object) array(
     'id' => 1,
  ),
  1 => 
  (object) array(
     'id' => 3,
  ),
  4 => 
  (object) array(
     'id' => 7,
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.