69

インデックス付きサブ配列の特定の値を多次元配列で検索する必要があります。

つまり、多次元配列の 1 つの列の値をチェックする必要があります。true値が多次元配列のどこかに存在する場合、それ以外の場合は返したいfalse

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

$my_array配列にキー「id」を持つ値が含まれているかどうかを確認する最も速くて効率的な方法を知りたいです。たとえばid => 152、多次元配列のどこかにtrue.

4

15 に答える 15

84

単純なループよりも高速なものはありません。いくつかの配列関数を組み合わせて実行できますが、それらもループとして実装されます。

function whatever($array, $key, $val) {
    foreach ($array as $item)
        if (isset($item[$key]) && $item[$key] == $val)
            return true;
    return false;
}
于 2011-08-09T02:43:37.577 に答える
27

** 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'));
于 2016-06-21T04:02:21.830 に答える
25

これは、多次元配列に対応するDan Grossmanの回答の更新版です(私が求めていたもの):

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;
}
于 2015-03-24T13:19:29.523 に答える
25

最も簡単な方法は次のとおりです。

$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!';
}
于 2018-12-12T06:01:53.283 に答える
8

多くの「id」ルックアップを行う必要があり、非常に高速である必要がある場合は、すべての「id」をキーとして含む 2 番目の配列を使用する必要があります。

$lookup_array=array();

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

既存の ID を非常に高速に確認できるようになりました。たとえば、次のようになります。

echo (isset($lookup_array[152]))?'yes':'no';
于 2011-08-09T02:58:45.570 に答える
5

良い解決策は、次のよう@Elias Van Ooteganなコメントで提供されるものです。

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

私はそれを試してみて、私のために働きました、バディに感謝します。

編集済み

注: PHP 5.5 以降で動作します。

于 2017-01-06T06:48:40.083 に答える
4

あなたの質問のように、実際にはどちらが単純な 2 次元配列であるほうがよいでしょうか? 見てください-

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

ご覧のとおり、実際には、key_name 'id' のみを持つ内部インデックスに $value があるかどうかのみをチェックします。key_name 'name' にも $value がある場合、ここでの他のいくつかの回答も true になる可能性があります

于 2016-08-11T15:28:15.397 に答える
4

TMTOWTDI。複雑さの順にいくつかのソリューションを次に示します。

(複雑さについての簡単な説明が続きます):O(n)または、「大きな o」は配列内の要素の数を意味する最悪のシナリオを意味し、 「小さな o」は最良のシナリオを意味します。長い離散数学の話を簡単に言うと、最悪のシナリオ のみを心配する必要があり、それがまたはでないことを確認してください。これは、全体の計算時間というよりも、増加に伴う計算時間の変化の尺度です。ウィキペディアには、計算に関する別名時間の複雑さに関する優れた記事がありますno(n)n ^ 2n!n

経験から学んだことがあるとすれば、それは、プログラムのほとんどを最適化するために多くの時間を費やすことは、何かをより良くするために費やすべき時間の無駄だということです。

解決策 0:O(n) / o(1)複雑さ:

このソリューションには、1 回の比較 - ループによる 1 回の反復という最良のシナリオがありますが、一致する値が配列の位置 0 にある場合のみです。最悪のシナリオは、配列にないため、配列のすべての要素を反復処理する必要があることです。

foreach ($my_array as $sub_array) {
    if (@$sub_array['id'] === 152) {
        return true;
    }
}
return false;

解決策 1:O(n) / o(n)複雑さ:

このソリューションは、一致する値がどこにあるかに関係なく、配列全体をループする必要があるため、常にn配列の反復になります。

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

解決策 2:O(n log n) / o(n log n)複雑さ:

ハッシュの挿入は、のlog n由来です。nハッシュ挿入 = n * log n. 最後に別のハッシュ ルックアップがありますがlog n、それは含まれていません。

$existence_hash = [];
foreach ($my_array as $sub_array) {
    $existence_hash[$sub_array['id']] = true;
}
return @$existence_hash['152'];
于 2011-08-09T03:13:15.490 に答える
0

これがパフォーマンスにとって良いか悪いかはわかりませんが、別の方法を次に示します。

$keys = array_map(function($element){return $element['id'];}, $my_array);
$flipped_keys = array_flip($keys);
if(isset($flipped_keys[40489]))
{
    // true
}
于 2021-07-10T23:59:37.220 に答える
-1

以下のコードで試してみてください。あらゆる種類の多次元配列検索で正常に機能するはずです。

ここでライブデモの例を見ることができます

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;
}
于 2016-12-02T16:14:32.167 に答える
-3

多次元配列に特定の値が部分的に含まれているかどうかを判断するために、次の関数を作成しました。

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);
于 2016-05-25T12:45:53.680 に答える