Проверьте, существует ли значение в многомерном массиве, используя array_search и array_column, не возвращающие значения массива [0]

Мне нужно проверить, существует ли значение в многомерном массиве. Я нашел этот пример в qaru.site/info/111937/... и на PHP.NET, который мне нравится, потому что это изящное и компактное решение, но я заметил странное поведение:

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

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

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



if(array_search(100, array_column($userdb, 'uid'))) {
    echo "FOUND";
}

Оператор IF не возвращает никакого значения, если вы проверяете существование любого значения массива FIRST (Array [0]). Он работает со значениями других массивов. Сначала попробуйте 100, затем попробуйте с 40489 (или попробуйте с "именем" или "pic_square").

Ответы

Ответ 1

Вы можете использовать in_array(), как показано ниже: -

<?php
$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'
    )
);
print_r(array_column($userdb, 'uid')); 
if(in_array(100, array_column($userdb, 'uid'))) { // search value in the array
    echo "FOUND";
}
?>

Вывод: - https://eval.in/1058147

Примечание: - ваш код также будет работать, если вы измените сравнение, как показано ниже: -

if(array_search(100, array_column($userdb, 'uid')) !== false) {
    echo "FOUND";
} else {
    echo "Not Found";
}

через руководство: - http://php.net/manual/en/function.array-search.php

Это насыщает: -

Возвращает ключ для иглы, если он найден в массиве, иначе FALSE.

php рассматривал 0 как false и 1 как true. Вот почему ваш код дает сбой, потому что ваш код возвращает 0 (как найдено совпадение в самом первом индексе массива).

Ответ 2

Это потому, что ваше значение 100 находится в первом индексе 0, поэтому, если условие терпит неудачу. Вместо этого сравните с false строго:

DEMO

if(array_search(100, array_column($userdb, 'uid')) !== False) {
    echo "FOUND";
} else {
    echo "Not Found";
}

Для этого примера лучше использовать in_array, так как вы просто проверяете, как элемент находится в массиве или нет. Используйте, array_search если вы хотите получить индекс элемента.

Ответ 3

Это потому, что array_search возвращает ключ, который в этом случае равен 0, что будет равно false. Вам нужно провести строжайшее сравнение, то есть:

if (false !== array_search(100, array_column($userdb, 'uid'))) {
    ...  
}

Глянь сюда

Ответ 4

Вы можете попробовать это:

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

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

$res2 =Array
(
'0' => Array
    (
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'urlof40489'
    )

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

foreach ($res1 as $key=>$item1)
{
    $val=$item1['uid'];
    foreach ($res2 as $key2=>$item2)
    {
          if ($item2['uid'] == $val)
           {
                //value 5465 found
           }
    }
}