массивы — PHP array_udiff странное поведение

У меня есть 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 поведение?

0

Решение

  1. Я почти уверен, что PHP ожидает, что аргументы функции сравнения будут взаимозаменяемыми, либо вы должны изменить индексы массива на общие, либо реализовать логику в функции сравнения, чтобы справиться с этим.
  2. Это не то, как работает функция сравнения.

    Функция сравнения должна возвращать целое число меньше, равно или больше нуля, если первый аргумент считается соответственно меньше, равен или больше второго.

Так:

$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
)

)
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector