Получить пересечение таблиц

У меня вопрос. Итак, у меня есть этот массив:

$a_list_id = array(
   0 => 1234
   1 => 739
   3 => 538
);

И этот массив:

$a_users = array(
    0 => array(
        id => 15627,
        name => test
    ),
    1 => array(
        id => 1234,
        name => test1
    ),
    2 => array(
        id => 739,
        name => test2
    )
)

Результат должен быть:

$a_response = array(
    0 => array(
       id => 1234,
       name => test1 
    )
)

Потому что идентификатор 1234 находится в обоих массивах. Я пытаюсь с array_intersect, но не работает. Не могли бы вы мне помочь?

4 ответа

Решение

Просто используйте петли:

$a_response = array();
foreach ($a_users as $array) {
    if (in_array($array['id'], $a_list_id)) {
        $a_response []= $a_users;
    }
}

Аргумент array_intersect будет давать полезные результаты только в том случае, если значения обоих массивов можно привести к одному и тому же типу. У вас есть массив целых чисел и другой массив массивов, они никогда не могут * совпадать, поэтому пересечение всегда будет пустым

Если вы хотите пересечение между массивами, то у вас есть два варианта:

  • Индексируйте массивы так, чтобы их ключи были значениями, которые вы хотите пересечь, и используйте array_intersect_key
  • Реализуйте свою собственную логику сравнения массивов с помощью array_uintersect и функции обратного вызова, которая знает структуру сравниваемых массивов.

пример первого:

$a_list_id = array(
   1234 => 1234
   739 => 739
   538 => 538
);

$a_users = array(
    15627 => array(
        id => 15627,
        name => test
    ),
    1234 => array(
        id => 1234,
        name => test1
    ),
    739 => array(
        id => 739,
        name => test2
    )
)

var_dump (array_intersect_key ($a_users, $a_list_id));

Пример последнего:

var_dump (array_uintersect ($a_users, $a_list_id, function ($user, $id) {
    return $user ["id"] - $id; // Result should be 0 if they match, as per documentation
}))

* Их можно считать одинаковыми в случае, когда одно значение является целым числом 0, а другое - пустым массивом, но это не очень полезно

Вы пытались использовать array_intersect_uassoc? http://php.net/manual/en/function.array-intersect-uassoc.php

function compare_ids($a, $b)
{
    return $a - $b['id'];
}

print_r(array_intersect_uassoc($a_list_id, $a_users, "compare_ids"));

Попробуйте приведенный ниже код с помощью функции array_search():

$a_list_id = array(1234, 538,739);

$a_users = array(
 array(
    'id'=> 15627,
    'name' => 'test'
),
 array(
    'id' => 1234,
    'name' => 'test1'
),
 array(
    'id' => 739,
    'name' => 'test2'
)
);

foreach($a_users as $a_user){
  if (in_array($a_user['id'], $a_list_id)) {
     $a_response[array_search($a_user['id'], $a_list_id)] = $a_user;
  }
}

print_r($a_response);
Другие вопросы по тегам