PHP: проверьте, существуют ли значение и ключ в многомерном массиве

Просто интересно, можете ли вы помочь мне с этим:

У меня есть многомерный массив...

$my_array = array(    
        0 =>  array(  
            "name"   => "john",  
            "id"    =>  4  
        ),  
        1   =>  array(  
            "name" =>  "mark",  
            "id" => 152  
        ), 
    2   =>  array(  
            "name" =>  "Eduard",  
            "id" => 152  
        )
);

Любая идея о том, что будет самым быстрым и эффективным способом проверки, содержит ли массив $my_array какое-либо значение с ключом "id" и его значением 152. Мне не нужно отображать или использовать любое из значений. Мне просто нужно проверить (вернуть true), есть ли в массиве какие-либо записи с идентификатором "ключ" и значением "152".

19 ответов

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

function whatever($array, $key, $val) {
    foreach ($array as $item)
        if (isset($item[$key]) && $item[$key] == $val)
            return true;
    return false;
}

Самый простой способ заключается в следующем:

$my_array = array(    
    0 =>  array(  
        "name"   => "john",  
        "id"    =>  4  
    ),  
    1   =>  array(  
        "name" =>  "mark",  
        "id" => 152  
    ), 
    2   =>  array(  
        "name" =>  "Eduard",  
        "id" => 152  
    )
);

if (array_search(152, array_column($my_array, 'id')) !== FALSE)
  echo 'FOUND!';
else
  echo 'NOT FOUND!';

** PHP >= 5.5

просто ты можешь использовать это

$key = array_search(40489, array_column($userdb, 'uid'));

Давайте предположим, что этот многомерный массив:

$userdb=Array
(
(0) => Array
    (
        (uid) => '100',
        (name) => 'Sandra Shush',
        (url) => 'urlof100'
    ),

(1) => Array
    (
        (uid) => '5465',
        (name) => 'Stefanie Mcmohn',
        (pic_square) => 'urlof100'
    ),

(2) => Array
    (
        (uid) => '40489',
        (name) => 'Michael',
        (pic_square) => 'urlof40489'
    )
);

$key = array_search(40489, array_column($userdb, 'uid'));

Вот обновленная версия ответа Дэна Гроссмана, которая будет обслуживать многомерные массивы (то, что я был после):

function find_key_value($array, $key, $val)
{
    foreach ($array as $item)
    {
        if (is_array($item) && find_key_value($item, $key, $val)) return true;

        if (isset($item[$key]) && $item[$key] == $val) return true;
    }

    return false;
}

Если вам нужно много раз выполнять поиск по id, и он должен быть очень быстрым, вы должны использовать второй массив, содержащий все идентификаторы в качестве ключей:

$lookup_array=array();

foreach($my_array as $arr){
    $lookup_array[$arr['id']]=1;
}

Теперь вы можете очень быстро проверить существующий идентификатор, например:

echo (isset($lookup_array[152]))?'yes':'no';

Хорошее решение может быть предоставлено @Elias Van Ootegan в комментарии это:

$ids = array_column($array, 'id', 'id');
echo isset($ids[40489])?"Exist":"Not Exist";

Я попробовал это и работал на меня, спасибо, приятель.

отредактированный

Примечание: это будет работать в PHP 5.5+

return 0 < count(
    array_filter(
        $my_array,
        function ($a) {
            return array_key_exists('id', $a) && $a['id'] == 152;
        }
    )
);

Замечания: array_key_exists Звонить не обязательно. Это просто поддается устойчивости кода.

Как и в вашем вопросе, который на самом деле является простым 2-D массивом, не лучше ли? Посмотри-

Допустим, ваше двумерное имя массива $ my_array и значение для поиска равно $ id

function idExists($needle='', $haystack=array()){
    //now go through each internal array
    foreach ($haystack as $item) {
        if ($item['id']===$needle) {
            return true;
        }
    }
    return false;
}

и назвать это:

idExists($id, $my_array);

Как вы можете видеть, на самом деле он только проверяет, имеет ли какой-либо внутренний индекс только имя-ключа 'id', ваше значение $. Некоторые другие ответы могут также привести к истине, если имя-ключа 'name' также имеет значение $

Я наткнулся на эту публикацию, пытаясь сделать то же самое, и придумал собственное решение, которое я хотел предложить будущим посетителям этой страницы (и посмотреть, не возникнет ли такой способ каких-либо проблем, которых я не предвидел).

Если вы хотите получить простой true или false output и хотите сделать это с помощью одной строки кода без функции или цикла, вы можете сериализовать массив, а затем использовать stripos для поиска значения:

stripos(serialize($my_array),$needle)

Мне кажется, это работает.

Попробуйте с этим кодом ниже. Он должен работать нормально для любого вида поиска в многомерном массиве.

Здесь вы можете увидеть LIVE DEMO ПРИМЕР

function multi_array_search($search_for, $search_in) {
    foreach ($search_in as $element) {
        if ( ($element === $search_for) ){
            return true;
        }elseif(is_array($element)){
            $result = multi_array_search($search_for, $element);
            if($result == true)
                return true;
        }
    }
    return false;
}

array_columnвозвращает значения одного столбца массива, и мы можем искать конкретное значение для них черезin_array

      if (in_array(152, array_column($my_array, 'id'))) {
    echo 'FOUND!';
} else {
    echo 'NOT FOUND!';
}

Я не знаю, лучше это или хуже для производительности, но вот альтернатива:

      $keys = array_map(function($element){return $element['id'];}, $my_array);
$flipped_keys = array_flip($keys);
if(isset($flipped_keys[40489]))
{
    // true
}

Используйте array_map ()

$ options - это массив, в котором вы ищете.

$arr = array_map(function($ar) {
    if(array_key_exists('name_of_the_key_you_search_for',$ar)){
        return true;
    }else{
        return false;
    }
},$options  );
var_dump($arr); //just for test, remove in the code

Вы можете создать очередь подмассивов и зациклить каждый:

      function existsKeyValue($myArray, $key, $value) {
    $queue = [$myArray]; //creating a queue of a single element, which is our outermost array

    //when we reach the count of the queue we looped all inner loops as well and failed to find the item
    for ($index = 0; $index < count($queue); $index++) {
        //Looping the current array, finding the key and the value
        foreach ($queue[$index] as $k => &$v) {
            //If they match the search, then we can return true
            if (($key === $k) && ($value === $v)) {
                return true;
            }
            //We need to make sure we did not already loop our current array to avoid infinite cycles
            if (is_array($v)) $queue[]=$v;
        }
    }
    return false;
}

$my_array = array(    
    0 =>  array(  
        "name"   => "john",  
        "id"    =>  4  
    ),  
    1   =>  array(  
        "name" =>  "mark",  
        "id" => 152  
    ), 
    2   =>  array(  
        "name" =>  "Eduard",  
        "id" => 152  
    )
);

echo var_dump(existsKeyValue($my_array, 'id', 152));

Просто используйтеarray_columnкак в примере ниже:

      $my_array = [
    [
        "name"  => "john",  
        "id"    =>  4  
    ],  
    [
        "name"  =>  "mark",  
        "id"    => 152  
    ], 
    [
        "name"  =>  "Eduard",  
        "id"    => 152  
    ]
];
var_dump(in_array(152, array_column($my_array, 'id'))); // true

Вы можете использовать это только с двумя параметрами

function whatever($array, $val) {
    foreach ($array as $item)
        if (isset($item) && in_array($val,$item))
            return 1;
    return 0;
}

отличается между isset и array_key_exits В чем разница между isset () и array_key_exists ()?

различны между == vs === Чем отличаются операторы сравнения PHP равенства (== двойное равенство) и идентичности (=== тройное равенство)?

      function specificValue(array $array,$key,$val) {
    foreach ($array as $item)
        if (array_key_exits($item[$key]) && $item[$key] === $val)
            return true;
    return false;
}
function checkMultiArrayValue($array) {
        global $test;
        foreach ($array as $key => $item) {

            if(!empty($item) && is_array($item)) {
                checkMultiArrayValue($item);
            }else {
                if($item)
                 $test[$key] = $item;

            }
        }
        return $test;   
    }

 $multiArray = array(    
                0 =>  array(  
                      "country"   => "",  
                      "price"    => 4,  
                      "discount-price" => 0,  
               ),);

$test = checkMultiArrayValue($multiArray);
echo "<pre>"
print_r($test);

Вернет массив, у которого есть индекс и значение

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

function findKeyValue ($array, $needle, $value, $found = false){
    foreach ($array as $key => $item){
        // Navigate through the array completely.
        if (is_array($item)){
            $found = $this->findKeyValue($item, $needle, $value, $found);
        }

        // If the item is a node, verify if the value of the node contains
        // the given search parameter. E.G.: 'value' <=> 'This contains the value'
        if ( ! empty($key) && $key == $needle && strpos($item, $value) !== false){
            return true;
        }
    }

    return $found;
}

Вызовите функцию следующим образом:

$this->findKeyValue($array, $key, $value);
Другие вопросы по тегам