配列があり、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.
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);
これはすでに回答されていると思いますが、私はこれを使用して、コードでもう少し拡張して、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 )