2015-07-02 3 views
0

У меня есть форма, которая представляет массив пользовательских ролей для обработки сервером. Вот пример $data['roles'] отправленный форме:Как проверить, присутствует ли какое-либо значение в массиве в другом массиве?

Array ([0] => 5 [1] => 16)

Я хочу, чтобы проверить, если $data['roles'] содержит либо один из значений 16, 17, 18 или 19. Как вы можете видеть в примере, она содержит 16. in_array кажется, что логичным выбором здесь, но передавая массив значений как игла in_array не работает:

$special_values = array(16, 17, 18, 19); 

if (in_array($special_values, $data['roles'])) { 
    // this returns false 
} 

ни делает проходя те же значения в массиве:

$special_values = array(5, 16); 

if (in_array($special_values, $data['roles'])) { 
    // this also returns false 
} 

Кроме того, места переключения между двумя массивами в виде иглы и стога сена не изменяют результат. Если бы я просто спросить, если 16 находится в массиве, он отлично работает:

$special_value = 16; 

if (in_array($special_value, $data['roles'])) { 
    // this returns true 
} 

documentation дает примеры использования массивов как иглы, однако, кажется, структура должна быть точно такой же в стоге сена для того, чтобы вернуться true. Но тогда я не понимаю, почему мой второй пример не работает. Я, очевидно, что-то делаю что-то неправильно или что-то здесь не вижу.

Каков наилучший способ проверить, есть ли любые значения в одном массиве в другом массиве?

Редактировать:This question (возможно дубликат) не спрашивает то же самое. Я хочу сопоставить любое значение в одном массиве с любым значением в другом. Связанный вопрос хочет совместить все значения в одном массиве со значениями другого.

+2

[ 'array_intersect'] (http://php.net/ручной/EN/весело ction.array-intersect.php) - это то, что вы ищете. – Andrew

+0

[array_intersect()] (http://www.php.net/manual/en/function.array-intersect.php) может быть более логичным выбором –

+0

Возможный дубликат [in \ _array, но игла - массив, что альтернатива для него] (http://stackoverflow.com/questions/2304436/in-array-but-needle-is-array-what-the-alternative-for-it) –

ответ

1

Это может помочь вам

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

$result = array_intersect($data['roles'], array(16, 17, 18, 19)); 
print_r($result); 

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

$result = false; 

foreach ($special_values as $val) { 
    if (in_array($val, $data['roles'], true)) { 
     $result = true; 
    } 
} 
+0

Yup, вот как мне это нужно, но я просто хотел, чтобы '$ result' был истинным или ложным. Поскольку 'array_intersect' возвращает массив совпадающих значений, я просто проверю, является ли' $ result' пустым или нет, и на основе моей логики. – Flux

+0

@Tyralion отредактирован. – Shreevardhan

1

Ставка способ заключается в использовании array_diff и пустые функции, я думаю:

if (! empty(array_diff($special_values, $data['roles']))) { 
    throw new Exception('Some of special values are not in data roles'); 
} 

или array_intersect, если вы хотите, чтобы возвращать значения, которые имеют место в обоих массивах.