Elimde uid
araması yapmak ve dizinin anahtarını almak istediğim bir dizi var.
Aşağıdaki 2 boyutlu diziye sahip olduğumuzu varsayalım:
$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'
)
);
Fonksiyon çağrısı search_by_uid(100)
(ilk kullanıcının uidsi)
0` döndürmelidir.
Fonksiyon çağrısı search_by_uid(40489)
2
döndürmelidir.
Döngüler oluşturmayı denedim, ancak daha hızlı çalışan bir kod istiyorum.
function searchForId($id, $array) {
foreach ($array as $key => $val) {
if ($val['uid'] === $id) {
return $key;
}
}
return null;
}
Bu işe yarayacak. Bu şekilde çağırmalısın:
$id = searchForId('100', $userdb);
Eğer ===
operatörünü kullanıyorsanız, karşılaştırılan türlerin tamamen aynı olması gerektiğini bilmeniz önemlidir, bu örnekte string
aramanız veya ===
yerine sadece ==
kullanmanız gerekir.
Angoru]1** cevabına göre. PHPnin sonraki sürümlerinde (
>= 5.5.0`) one-liner kullanabilirsiniz.
$key = array_search('100', array_column($userdb, 'uid'));
İşte belgeler: http://php.net/manual/en/function.array-column.php.
Jakub'un mükemmel cevabından yola çıkarak, anahtarın belirtilmesine izin verecek daha genelleştirilmiş bir arama (sadece uid için değil):
function searcharray($value, $key, $array) {
foreach ($array as $k => $val) {
if ($val[$key] == $value) {
return $k;
}
}
return null;
}
Kullanım: $results = searcharray('searchvalue', searchkey, $array);
Bunun zaten yanıtlandığını biliyorum, ancak bunu kullandım ve kodumda biraz daha genişlettim, böylece yalnızca uid'ye göre arama yapmak zorunda kalmadınız. Sadece bu işleve ihtiyaç duyabilecek herkes için paylaşmak istedim.
İşte benim örneğim ve lütfen bunun benim ilk cevabım olduğunu unutmayın. Param dizisini çıkardım çünkü sadece belirli bir dizide arama yapmam gerekiyordu, ama siz kolayca ekleyebilirsiniz. Aslında sadece uid'den daha fazlasına göre arama yapmak istedim.
Ayrıca, benim durumumda, benzersiz olmayabilecek diğer alanlara göre arama sonucunda döndürülecek birden fazla anahtar olabilir.
/**
* @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;
}
Daha sonra, bunu başka bir değer ve ilişkisel anahtar aramama izin verecek şekilde yazdım. Böylece ilk örneğim, herhangi bir belirli ilişkisel anahtarda bir değer aramanıza ve tüm eşleşmeleri döndürmenize olanak tanır.
Bu ikinci örnek, bir değerin ('Taylor') belirli bir ilişkisel anahtarda (first_name) AND başka bir değerin (true) başka bir ilişkisel anahtarda (employed) bulunduğu yerleri gösterir ve tüm eşleşmeleri döndürür (İlk adı 'Taylor' AND olan kişilerin çalıştığı anahtarlar).
/**
* @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;
}
İşlevin kullanımı
$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);
Sonuç
Array ( [0] => 2 )