PHP 多次元配列の値による検索

配列があり、uidを検索して、その配列のキーを取得したい。

以下のような2次元の配列があるとします。

$userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'urlof40489'
    )
);

関数コール search_by_uid(100) (最初のユーザのuid) は 0 を返すはずです。

関数コール search_by_uid(40489)2 を返します。

ループを作ってみましたが、より速く実行できるコードが欲しいです。

ソリューション
function searchForId($id, $array) {
   foreach ($array as $key => $val) {
       if ($val['uid'] === $id) {
           return $key;
       }
   }
   return null;
}

これで動作します。こんな感じで呼んでください。

$id = searchForId('100', $userdb);

この例では、stringを検索するか、===の代わりに==を使用しなければなりません。

angoru]1**の回答に基づいています。PHPの後期バージョン(>= 5.5.0)では、ワンライナーを使用することができます。

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

ここにドキュメントがあります: http://php.net/manual/en/function.array-column.php.

解説 (10)

Jakub'さんの素晴らしい回答を参考に、キーを指定できる(uidに限らない)、より一般的な検索方法を紹介します。

function searcharray($value, $key, $array) {
   foreach ($array as $k => $val) {
       if ($val[$key] == $value) {
           return $k;
       }
   }
   return null;
}

使い方です。$results = searcharray('searchvalue', searchkey, $array);

解説 (1)

これはすでに回答されていると思いますが、私はこれを使用して、コードでもう少し拡張して、uidだけで検索しないようにしました。この機能を必要としている人のために共有したいと思います。

以下は私の例ですが、これは私の最初の回答であることをご了承ください。特定の配列だけを検索する必要があったので、param配列を取り除きましたが、簡単に追加することができます。私は基本的にuid以外のもので検索したかったのです。

また、私の状況では、ユニークではない他のフィールドで検索した結果、複数のキーが返される可能性があります。

 /**
     * @param array multidimensional 
     * @param string value to search for, ie a specific field name like name_first
     * @param string associative key to find it in, ie field_name
     * 
     * @return array keys.
     */
     function search_revisions($dataArray, $search_value, $key_to_search) {
        // This function will search the revisions for a certain value
        // related to the associative key you are looking for.
        $keys = array();
        foreach ($dataArray as $key => $cur_value) {
            if ($cur_value[$key_to_search] == $search_value) {
                $keys[] = $key;
            }
        }
        return $keys;
    }

その後、私は結局、別の値と連想キーを検索できるようにするためにこれを書きました。つまり、最初の例では、任意の特定の連想キーで値を検索し、マッチしたものをすべて返すことができます。

2つ目の例では、ある値('Taylor')が特定の連想キー(first_name)で見つかり、**別の値(true)が別の連想キー(employed)で見つかり、すべてのマッチ(first nameが 'Taylor' ANDの人がemployedであるキー)を返すことができます。

/**
 * @param array multidimensional 
 * @param string $search_value The value to search for, ie a specific 'Taylor'
 * @param string $key_to_search The associative key to find it in, ie first_name
 * @param string $other_matching_key The associative key to find in the matches for employed
 * @param string $other_matching_value The value to find in that matching associative key, ie true
 * 
 * @return array keys, ie all the people with the first name 'Taylor' that are employed.
 */
 function search_revisions($dataArray, $search_value, $key_to_search, $other_matching_value = null, $other_matching_key = null) {
    // This function will search the revisions for a certain value
    // related to the associative key you are looking for.
    $keys = array();
    foreach ($dataArray as $key => $cur_value) {
        if ($cur_value[$key_to_search] == $search_value) {
            if (isset($other_matching_key) && isset($other_matching_value)) {
                if ($cur_value[$other_matching_key] == $other_matching_value) {
                    $keys[] = $key;
                }
            } else {
                // I must keep in mind that some searches may have multiple
                // matches and others would not, so leave it open with no continues.
                $keys[] = $key;
            }
        }
    }
    return $keys;
}

関数の使用法について

$data = array(
    array(
        'cust_group' => 6,
        'price' => 13.21,
        'price_qty' => 5
    ),
    array(
        'cust_group' => 8,
        'price' => 15.25,
        'price_qty' => 4
    ),
    array(
        'cust_group' => 8,
        'price' => 12.75,
        'price_qty' => 10
    )
);

$findKey = search_revisions($data,'8', 'cust_group', '10', 'price_qty');
print_r($findKey);

結果

Array ( [0] => 2 ) 
解説 (0)