web-dev-qa-db-ja.com

array [0]の値を返さないarray_searchとarray_columnを使用して、多次元配列に値が存在するかどうかを確認します

多次元配列に値が存在するかどうかを確認する必要があります。 StackoverflowPHP.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ステートメントは、check[〜#〜]のいずれかの値の存在をチェックする場合、値を返しません。 first [〜#〜]配列(Array [0])。他の配列の値で動作します。 100最初に、次に40489(または「名前」または「pic_square」で試してください)。

23
Nicero

以下のように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を返します。

php0falseとして、1trueとして処理しました。コードが0(配列の最初のインデックスで見つかった一致として)を返すため、コードが失敗します。

これは、値100が最初のインデックス0にあるため、条件が失敗したためです。代わりにfalseと厳密に比較してください:

[〜#〜] demo [〜#〜]

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

この場合、要素が配列内にあるかどうかを確認するだけなので、in_arrayを使用することをお勧めします。要素のインデックスを取得する場合は、array_searchを使用します。

4
Thamilan

array_searchはキーを返します。この場合は0、これはfalseと同等です。厳密な比較を行う必要があります。つまり:

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

こちらを参照

3
billyonecan

これを試してみてください:

$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
           }
    }
}
0
Ranjith R