Как я могу использовать in_array, если стрелка является массивом? - PullRequest
45 голосов
/ 21 февраля 2010

У меня есть 2 массива, значение будет загружено из базы данных, ниже приведен пример:

$arr1 = array(1,2,3);
$arr2 = array(1,2,3,4,5,6,7);

Что я хочу сделать, это проверить, существуют ли все значения в $arr1 в $arr2. Приведенный выше пример должен быть TRUE while:

$arr3 = array(1,2,4,5,6,7);

сравнение $arr1 с $arr3 вернет FALSE.

Обычно я использую in_array, потому что мне нужно проверить только одно значение в массиве. Но в этом случае in_array нельзя использовать. Я хотел бы посмотреть, есть ли простой способ выполнить проверку с минимальным циклом.

ОБНОВЛЕНИЕ для уточнения.

Первый массив будет набором, который содержит уникальные значения. Второй массив может содержать дублированные значения. Им обоим гарантируется массив перед обработкой.

Ответы [ 4 ]

79 голосов
/ 21 февраля 2010

Использование array_diff():

$arr1 = array(1,2,3);
$arr2 = array(1,2,3,4,5,6,7);
$arr3 = array_diff($arr1, $arr2);
if (count($arr3) == 0) {
  // all of $arr1 is in $arr2
}
28 голосов
/ 21 февраля 2010

Вы можете использовать array_intersect или array_diff :

$arr1 = array(1,2,3);
$arr2 = array(1,2,3,4,5,6,7);

if ( $arr1 == array_intersect($arr1, $arr2) ) {
    // All elements of arr1 are in arr2
}

Однако, если вам не нужно использовать результат пересечения (что, по-видимому, соответствует вашему случаю), использование array_diff более эффективно по пространству и времени:

$arr1 = array(1,2,3);
$arr2 = array(1,2,3,4,5,6,7);
$diff = array_diff($arr1, $arr2);

if ( empty($diff) ) {
    // All elements of arr1 are in arr2
}
5 голосов
/ 21 февраля 2010

Вы можете попробовать использовать функцию array_diff () , чтобы найти разницу между двумя массивами, это может вам помочь. Я думаю, чтобы уточнить, что вы имеете в виду, все значения в первом массиве должны быть во втором массиве, но не наоборот.

0 голосов
/ 12 декабря 2011

В моем конкретном случае мне нужно было проверить, была ли обработана пара идентификаторов ранее или нет. Так просто array_diff() у меня не сработало.

Вместо этого я сгенерировал ключи из идентификаторов, отсортированных по алфавиту, и использовал их с in_array:

<?php
$pairs = array();
// ...
$pair = array($currentId, $id);
sort($pair);
$pair = implode('-', $pair);
if (in_array($pair, $pairs)) {
    continue;
}
$pairs[$pair] = $pair;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...