Поиск многомерного массива PHP по значению
У меня есть массив, где я хочу искать uid
и получить ключ от массива.
Примеры
Предположим, что мы имеем следующий двумерный массив:
$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
.
Я пробовал создавать циклы, но мне нужен более быстрый исполняемый код.
Ответы
Ответ 1
function searchForId($id, $array) {
foreach ($array as $key => $val) {
if ($val['uid'] === $id) {
return $key;
}
}
return null;
}
Это сработает. Вы должны называть это следующим образом:
$id = searchForId('100', $userdb);
Важно знать, что если вы используете ===
, то сравниваемые типы должны быть точно такими же, в этом примере вам нужно искать string
или просто использовать ==
вместо ===
.
На основе ответа angoru. В более поздних версиях PHP (>= 5.5.0
) вы можете использовать один-лайнер.
$key = array_search('100', array_column($userdb, 'uid'));
Вот документация: http://php.net/manual/en/function.array-column.php.
Ответ 2
Если вы используете (PHP 5 >= 5.5.0), вам не нужно писать свою собственную функцию, чтобы сделать это, просто напишите эту строку и все сделайте.
Если вы хотите получить только один результат:
$key = array_search(40489, array_column($userdb, 'uid'));
Для нескольких результатов
$keys = array_keys(array_column($userdb, 'uid'), 40489);
Если у вас есть ассоциативный массив, как указано в комментариях, вы можете сделать это с помощью
$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, 'uid')),40489);
Если вы используете PHP < 5.5.0, вы можете использовать этот backport, спасибо ramsey!
Обновление: я делаю несколько простых тестов, и форма с несколькими результатами, кажется, самая быстрая, даже быстрее, чем пользовательская функция Jakub!
Ответ 3
Создание 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);
Ответ 4
Я знаю, что на этот вопрос уже был дан ответ, но я использовал его и немного расширил в своем коде, чтобы у вас не было поиска только по 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;
}
Позже я закончил писать это, чтобы позволить мне искать другое значение и ассоциативный ключ. Итак, мой первый пример позволяет вам искать значение в любом конкретном ассоциативном ключе и возвращать все совпадения.
Во втором примере показано, где в определенном ассоциативном ключе (first_name) найдено значение ('Taylor') И в другом ассоциативном ключе (используется) найдено другое значение (true), и возвращены все совпадения (Ключи, в которых люди с первым именем) "Тейлор" И работают).
/**
* @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 )
Ответ 5
В более поздних версиях PHP (> = 5.5.0) вы можете использовать эту строку:
$key = array_search('100', array_column($userdb, 'uid'));
Ответ 6
Я модифицировал один из примеров ниже описания функции array_search. Функция searchItemsByKey
возвращает все значения по $ key из многомерного массива (N уровней). Возможно, это было бы полезно для кого-то. Пример:
$arr = array(
'XXX'=>array(
'YYY'=> array(
'AAA'=> array(
'keyN' =>'value1'
)
),
'ZZZ'=> array(
'BBB'=> array(
'keyN' => 'value2'
)
)
//.....
)
);
$result = searchItemsByKey($arr,'keyN');
print '<pre>';
print_r($result);
print '<pre>';
// OUTPUT
Array
(
[0] => value1
[1] => value2
)
Код функции:
function searchItemsByKey($array, $key)
{
$results = array();
if (is_array($array))
{
if (isset($array[$key]) && key($array)==$key)
$results[] = $array[$key];
foreach ($array as $sub_array)
$results = array_merge($results, searchItemsByKey($sub_array, $key));
}
return $results;
}
Ответ 7
Похоже, array_filter будет подходящим решением для этого...
$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'
)
);
PHP Code
<?php
$search = 5465;
$found = array_filter($userdb,function($v,$k) use ($search){
return $v['uid'] == $search;
},ARRAY_FILTER_USE_BOTH) // With latest PHP third parameter is mandatory.. Available Values:- ARRAY_FILTER_USE_BOTH OR ARRAY_FILTER_USE_KEY
$values= print_r(array_value($found));
$keys = print_r(array_keys($found));
Ответ 8
Вот один лайнер для того же,
$pic_square = $userdb[array_search($uid,array_column($userdb, 'uid'))]['pic_square'];
Ответ 9
Даже если это старый вопрос и имеет принятый ответ, я подумал, что я бы предложил одно изменение принятому ответу. Итак, во-первых, я согласен, что принятый ответ здесь верен.
function searchArrayKeyVal($sKey, $id, $array) {
foreach ($array as $key => $val) {
if ($val[$sKey] == $id) {
return $key;
}
}
return false;
}
Вместо этого вместо параметра "uid" заменяется параметр в функции, поэтому теперь вызов приведенного ниже кода означает, что вы можете использовать одну функцию для нескольких типов массивов. Небольшое изменение, но это немного отличается.
// Array Data Of Users
$userdb = array (
array ('uid' => '100','name' => 'Sandra Shush','url' => 'urlof100' ),
array ('uid' => '5465','name' => 'Stefanie Mcmohn','url' => 'urlof100' ),
array ('uid' => '40489','name' => 'Michael','url' => 'urlof40489' ),
);
// Obtain The Key Of The Array
$arrayKey = searchArrayKeyVal("uid", '100', $userdb);
if ($arrayKey!==false) {
echo "Search Result: ", $userdb[$arrayKey]['name'];
} else {
echo "Search Result can not be found";
}
Пример скрипта PHP
Ответ 10
Мне пришлось использовать функцию un, которая находит все элементы в массиве. Поэтому я изменил функцию, выполненную Якубом Трунечком следующим образом:
function search_in_array_r($needle, $array) {
$found = array();
foreach ($array as $key => $val) {
if ($val[1] == $needle) {
array_push($found, $val[1]);
}
}
if (count($found) != 0)
return $found;
else
return null;
}
Ответ 11
вы можете использовать эту функцию;
https://github.com/serhatozles/ArrayAdvancedSearch
<?php
include('ArraySearch.php');
$query = "a='Example World' and b>='2'";
$Array = array(
'a' => array('d' => '2'),
array('a' => 'Example World','b' => '2'),
array('c' => '3'), array('d' => '4'),
);
$Result = ArraySearch($Array,$query,1);
echo '<pre>';
print_r($Result);
echo '</pre>';
// Output:
// Array
// (
// [0] => Array
// (
// [a] => Example World
// [b] => 2
// )
//
// )
Ответ 12
/**
* searches a simple as well as multi dimension array
* @param type $needle
* @param type $haystack
* @return boolean
*/
public static function in_array_multi($needle, $haystack){
$needle = trim($needle);
if(!is_array($haystack))
return False;
foreach($haystack as $key=>$value){
if(is_array($value)){
if(self::in_array_multi($needle, $value))
return True;
else
self::in_array_multi($needle, $value);
}
else
if(trim($value) === trim($needle)){//visibility fix//
error_log("$value === $needle setting visibility to 1 hidden");
return True;
}
}
return False;
}
Ответ 13
$a = ['x' => ['eee', 'ccc'], 'b' => ['zzz']];
$found = null;
$search = 'eee';
array_walk($a, function ($k, $v) use ($search, &$found) {
if (in_array($search, $k)) {
$found = $v;
}
});
var_dump($found);
Ответ 14
Попробуйте это
<?php
function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
$current_key=$key;
if($needle===$value OR (is_array($value) &&
recursive_array_search($needle,$value) !== false)) {
return $current_key;
}
}
return false;
}
?>
Ответ 15
Я хочу проверить tha в следующем массиве $arr
существует ли 'abc' в вспомогательных массивах или нет
$arr = array(
array(
'title' => 'abc'
)
);
Тогда я могу использовать этот
$res = array_search('abc', array_column($arr, 'title'));
if($res == ''){
echo 'exists';
} else {
echo 'notExists';
}
Я думаю, что это самый простой способ определить
Ответ 16
Просто поделись, может может и понравится.
if( ! function_exists('arraySearchMulti')){
function arraySearchMulti($search,$key,$array,$returnKey=false)
{
foreach ($array as $k => $val) {
if (isset($val[$key])) {
if ((string)$val[$key] == (string)$search) {
return ($returnKey ? $k : $val);
}
}else{
return (is_array($val) ? arraySearchMulti($search,$key,$val,$returnKey) : null);
}
}
return null;
}}
Ответ 17
Попробуйте также
function search_in_array($srchvalue, $array)
{
if (is_array($array) && count($array) > 0)
{
$foundkey = array_search($srchvalue, $array);
if ($foundkey === FALSE)
{
foreach ($array as $key => $value)
{
if (is_array($value) && count($value) > 0)
{
$foundkey = search_in_array($srchvalue, $value);
if ($foundkey != FALSE)
return $foundkey;
}
}
}
else
return $foundkey;
}
}
Ответ 18
for( $i =0; $i < sizeof($allUsers); $i++)
{
$NEEDLE1='firstname';
$NEEDLE2='emailAddress';
$sterm='Tofind';
if(isset($allUsers[$i][$NEEDLE1]) && isset($allUsers[$i][$NEEDLE2])
{
$Fname= $allUsers[$i][$NEEDLE1];
$Lname= $allUsers[$i][$NEEDLE2];
$pos1 = stripos($Fname, $sterm);
$pos2=stripos($Lname, $sterm);//not case sensitive
if($pos1 !== false ||$pos2 !== false)
{$resultsMatched[] =$allUsers[$i];}
else
{ continue;}
}
}
Print_r($resultsMatched); //will give array for matched values even partially matched
С помощью приведенного выше кода можно найти любые (частично совпадающие) данные из любого столбца в 2D-массиве, поэтому идентификатор пользователя может быть найден по требованию.
Ответ 19
Развернув на созданную функцию @mayhem, этот пример будет скорее "нечетким" поиском, если вы просто захотите сопоставить часть (большую часть) поисковой строки:
function searchArrayKeyVal($sKey, $id, $array) {
foreach ($array as $key => $val) {
if (strpos(strtolower($val[$sKey]), strtolower(trim($id))) !== false) {
return $key;
}
}
return false;
}
Например, значение в массиве - Добро пожаловать в Нью-Йорк! и вам нужен первый экземпляр только "Нью-Йорк!"
Ответ 20
$search1 = 'demo';
$search2 = 'bob';
$arr = array('0' => 'hello','1' => 'test','2' => 'john','3' => array('0' => 'martin', '1' => 'bob'),'4' => 'demo');
foreach ($arr as $value) {
if (is_array($value)) {
if (in_array($search2, $value)) {
echo "successsfully";
//execute your code
}
} else {
if ($value == $search1) {
echo "success";
}
}
}
Ответ 21
Если вопрос то есть
$a = [
[
"_id" => "5a96933414d48831a41901f2",
"discount_amount" => 3.29,
"discount_id" => "5a92656a14d488570c2c44a2",
],
[
"_id" => "5a9790fd14d48879cf16a9e8",
"discount_amount" => 4.53,
"discount_id" => "5a9265b914d488548513b122",
],
[
"_id" => "5a98083614d488191304b6c3",
"discount_amount" => 15.24,
"discount_id" => "5a92806a14d48858ff5c2ec3",
],
[
"_id" => "5a982a4914d48824721eafe3",
"discount_amount" => 45.74,
"discount_id" => "5a928ce414d488609e73b443",
],
[
"_id" => "5a982a4914d48824721eafe55",
"discount_amount" => 10.26,
"discount_id" => "5a928ce414d488609e73b443",
],
];
Ans:
function searchForId($id, $array) {
$did=0;
$dia=0;
foreach ($array as $key => $val) {
if ($val['discount_id'] === $id) {
$dia +=$val['discount_amount'];
$did++;
}
}
if($dia != '') {
echo $dia;
var_dump($did);
}
return null;
};
print_r(searchForId('5a928ce414d488609e73b443',$a));
Ответ 22
мое решение:
function searchArrayForField($array, $field, $value) {
$i = 0;
foreach ($array as &$row) {
if ($row[$field] === $value) {
return $i;
}
$i++
}
return '';
}