Несколько простой вопрос о пересечении массива PHP - PullRequest
6 голосов
/ 16 ноября 2009

Может быть, я схожу с ума, но я мог бы поклясться, что есть основная функция PHP, которая принимает в качестве аргументов два массива:

$a = array('1', '3');
$b = array('1'=>'apples', '2'=>'oranges', '3'=>'kiwis');

И выполняет пересечение, где значения из массива $a проверяются на наличие конфликтов с ключами в массиве $b. Возвращая что-то вроде

array('1'=>'apples', '3'=>'kiwis');

Существует ли такая функция (которую я пропустил в документации), или существует очень оптимизированный способ достижения того же самого?

Ответы [ 4 ]

10 голосов
/ 16 ноября 2009

попробуйте использовать array_flip {переключает ключи с их значениями}, а затем используйте array_intersect () на вашем примере:

$c = array_flip($b); // so you have your original b-array
$intersect = array_intersect($a,c);
2 голосов
/ 16 ноября 2009

Я не на 100% ясно, что вы хотите. Хотите проверить значения от $ a против KEYS от $ b?

Есть несколько функций пересечения:

http://php.net/manual/en/function.array-intersect.php http://www.php.net/manual/en/function.array-intersect-key.php

Но, возможно, вам нужно:

http://www.php.net/manual/en/function.array-intersect-ukey.php, чтобы вы могли определить свою собственную функцию для сопоставления клавиш и / или значений.

1 голос
/ 16 ноября 2009

Выполните простое foreach, чтобы выполнить итерацию первого массива и получить соответствующие значения из второго массива:

$output = array();
foreach ($a as $key) {
    if (array_key_exists($key, $b)) {
        $output[$key] = $b[$key];
    }
}
0 голосов
/ 16 ноября 2009

Просто вариант ответа Gumbo должен быть более эффективным, поскольку тесты на ключах выполняются непосредственно перед входом в цикл.

$intersection = array_intersect($a, array_keys($b));
$result=array();
foreach ($intersection as $key) {
    $result[$k]=$b[$k];
}
...