У меня есть 2 массива, $array0
а также $array1
, Давайте предварительно заполнить их:
$user01 = array("no" => 1, "name" => "john");
$user02 = array("no" => 2, "name" => "lewis");
$user03 = array("no" => 3, "name" => "dan");
$array0 = array($user01, $user02, $user03, $user04);
$user11 = array("id" => 1, "name" => "john", "attr" => "foo");
$user12 = array("id" => 7, "name" => "mark", "attr" => "bar");
$array1 = array($user11, $user12);
Я хочу получить всех пользователей из $array0
кто не в $array1
вот и пользуюсь array_udiff
:
$diff = array_udiff($array0, $array1, function ($userA, $userB) {
return $userA['no'] == $userB['id'];
});
Тем не менее, внутри анонимной функции сравнения, если я делаю var_dump
из $userA
а также $userB
кажется, они оба принадлежат $array0
в то время как поведение, которое я ожидал, для $userA
принадлежать к $array0
а также $userB
в $array1
,
Т.е. ожидаемый ответ [[2, "lewis"], [3, "dan"]]
, но я получаю «не найденный индекс»: «неопределенный индекс id
«в строке функции сравнения.
Я что-то пропустил на array_udiff
поведение?
Это не то, как работает функция сравнения.
Функция сравнения должна возвращать целое число меньше, равно или больше нуля, если первый аргумент считается соответственно меньше, равен или больше второго.
Так:
$user01 = array("id" => 1, "name" => "john"); // "no" changed to "id"$user02 = array("id" => 2, "name" => "lewis");
$user03 = array("id" => 3, "name" => "dan");
$array0 = array($user01, $user02, $user03); // non-existant $user04 removed
$user11 = array("id" => 1, "name" => "john", "attr" => "foo");
$user12 = array("id" => 7, "name" => "mark", "attr" => "bar");
$array1 = array($user11, $user12);
$diff = array_udiff($array0, $array1, function ($userA, $userB) {
if( $userA['id'] == $userB['id'] ) { return 0; } // compare function re-jiggered
else { return $userA['id'] - $userB['id']; }
});
print_r($diff);
Урожайность:
Array
(
[1] => Array
(
[id] => 2
[name] => lewis
)
[2] => Array
(
[id] => 3
[name] => dan
)
)
Других решений пока нет …