我有 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。
假设
$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秒)
循环第二个数组并使用
in_array
方法检查第一个中是否存在值
$firstArray = array(5, 6);
foreach ($objects as $key => $object) {
if (in_array($object->id, $firstArray)) {
unset($objects[$key];
}
}
对于 5.3 之前的版本
foreach( $arr_2nd as $key => $val )
{
$arr_2nd[$key] = $val->id;
}
array_diff( $arr_1st, $arr_2nd );
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,
),
)