in_array () и многомерный массив - PullRequest
230 голосов
/ 09 ноября 2010

Я использую in_array(), чтобы проверить, существует ли значение в массиве, как показано ниже,

$a = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $a)) 
{
    echo "Got Irix";
}

//print_r($a);

а как насчет многомерного массива (ниже) - как я могу проверить это значение, существует ли оно в многомерном массиве?

$b = array(array("Mac", "NT"), array("Irix", "Linux"));

print_r($b);

или я не должен использовать in_array(), когда дело доходит до многомерного массива?

Ответы [ 22 ]

1 голос
/ 17 июня 2019

Поскольку PHP 5.6 , существует лучшее и более чистое решение для первоначального ответа:

С многомерным массивом, подобным этому:

$a = array(array("Mac", "NT"), array("Irix", "Linux"))

Мы можем использовать оператор сплата :

return in_array("Irix", array_merge(...$a), true)

Если у вас есть такие строковые ключи:

$a = array("a" => array("Mac", "NT"), "b" => array("Irix", "Linux"))

Вам нужно будет использовать array_values, чтобы избежать ошибки Cannot unpack array with string keys:

return in_array("Irix", array_merge(...array_values($a)), true)
1 голос
/ 01 июня 2017

Я считаю, что вы можете просто использовать array_key_exists в настоящее время:

<?php
$a=array("Mac"=>"NT","Irix"=>"Linux");
if (array_key_exists("Mac",$a))
  {
  echo "Key exists!";
  }
else
  {
  echo "Key does not exist!";
  }
?>
1 голос
/ 29 марта 2017

Вот мое предложение на основе решения json_encode () с:

  • без учета регистра опция
  • , возвращающаяcount вместо true
  • в любом месте массива (ключи и значения)

Если слово не найдено, оно все равно возвращает 0 равно false .

function in_array_count($needle, $haystack, $caseSensitive = true) {
    if(!$caseSensitive) {
        return substr_count(strtoupper(json_encode($haystack)), strtoupper($needle));
    }
    return substr_count(json_encode($haystack), $needle);
}

Надеюсь, это поможет.

0 голосов
/ 29 марта 2019

Я использовал этот метод, работает для любого количества вложенных и не требует взлома

<?php
    $blogCategories = [
        'programing' => [
            'golang',
            'php',
            'ruby',
            'functional' => [
                'Erlang',
                'Haskell'
            ]
        ],
        'bd' => [
            'mysql',
            'sqlite'
        ]
    ];
    $it = new RecursiveArrayIterator($blogCategories);
    foreach (new RecursiveIteratorIterator($it) as $t) {
        $found = $t == 'Haskell';
        if ($found) {
           break;
        }
    }
0 голосов
/ 13 марта 2019

Я нашел действительно маленькое простое решение:

Если ваш массив:

Array
(
[details] => Array
    (
        [name] => Dhruv
        [salary] => 5000
    )

[score] => Array
    (
        [ssc] => 70
        [diploma] => 90
        [degree] => 70
    )

)

тогда код будет выглядеть так:

 if(in_array("5000",$array['details'])){
             echo "yes found.";
         }
     else {
             echo "no not found";
          }
0 голосов
/ 09 января 2013

Это тоже работает, создавая сначала новый одномерный массив из исходного.

$arr = array("key1"=>"value1","key2"=>"value2","key3"=>"value3");

foreach ($arr as $row)  $vector[] = $row['key1'];

in_array($needle,$vector);
0 голосов
/ 09 января 2014

Укороченная версия, для многомерных массивов, созданных на основе наборов результатов базы данных.

function in_array_r($array, $field, $find){
    foreach($array as $item){
        if($item[$field] == $find) return true;
    }
    return false;
}

$is_found = in_array_r($os_list, 'os_version', 'XP');

Вернется, если массив $ os_list содержит 'XP' в поле os_version.

0 голосов
/ 09 июля 2017

вы можете использовать вот так

$result = array_intersect($array1, $array2);
print_r($result);

http://php.net/manual/tr/function.array-intersect.php

0 голосов
/ 22 июня 2017

Я искал функцию, которая позволила бы мне искать и строки, и массивы (как иголку) в массиве (стоге сена), поэтому я добавил к ответу @ jwueller .

Вот мой код:

/**
 * Recursive in_array function
 * Searches recursively for needle in an array (haystack).
 * Works with both strings and arrays as needle.
 * Both needle's and haystack's keys are ignored, only values are compared.
 * Note: if needle is an array, all values in needle have to be found for it to
 * return true. If one value is not found, false is returned.
 * @param  mixed   $needle   The array or string to be found
 * @param  array   $haystack The array to be searched in
 * @param  boolean $strict   Use strict value & type validation (===) or just value
 * @return boolean           True if in array, false if not.
 */
function in_array_r($needle, $haystack, $strict = false) {
     // array wrapper
    if (is_array($needle)) {
        foreach ($needle as $value) {
            if (in_array_r($value, $haystack, $strict) == false) {
                // an array value was not found, stop search, return false
                return false;
            }
        }
        // if the code reaches this point, all values in array have been found
        return true;
    }

    // string handling
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle)
            || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }
    return false;
}
0 голосов
/ 20 сентября 2012

Пожалуйста, попробуйте:

in_array("irix",array_keys($b))
in_array("Linux",array_keys($b["irix"])

Я не уверен в необходимости, но это может сработать для вашего требования

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