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".

Ответы

Ответ 1

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

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

Ответ 2

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

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;
}

Ответ 3

** PHP >= 5.5

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

$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'));

Ответ 4

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

$lookup_array=array();

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

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

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

Ответ 5

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

Скажем, ваше двумерное имя массива $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" только с вашим значением $. Некоторые другие ответы здесь также могут быть истинными, если key_name 'name' также имеет значение $

Ответ 6

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

Примечание: вызов array_key_exists не является обязательным. Он просто поддается кодированию выносливости.

Ответ 7

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

Здесь вы можете увидеть LIVE DEMO EXAMPLE

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;
}

Ответ 8

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

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

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

Edited

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

Ответ 9

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

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);

Ответ 10

Используйте 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

Ответ 11

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);

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

Ответ 12

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

$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!';