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.
Я пробовал делать циклы, но я хочу быстрее выполнять код.
21 ответов:
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.
Если вы используете (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 это backport, спасибо Рэмси!
обновление: я был создание некоторых простых тестов и формы с несколькими результатами кажется самым быстрым, даже быстрее, чем пользовательская функция Jakub!
строим у Якуба отличный ответ, вот более обобщенный поиск, который позволит ключ к указанному (не только для жидкости):
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; }позже я закончил писать это, чтобы позволить мне искать другое значение и ассоциативный ключ. Итак, мой первый пример позволяет вам искать значение в любом конкретном ассоциативном ключе и возвращать все совпадения.
этот второй пример показывает вам, где значение ('Taylor') находится в определенном ассоциативном ключе (first_name)и другое значение (true) находится в другом ассоциативном ключе (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 )
Я изменил один из примеров ниже описание функции 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; }
в более поздних версиях PHP (>= 5.5.0) вы можете использовать этот однострочный:
$key = array_search('100', array_column($userdb, 'uid'));
выглядит 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-кода
<?php $search = 5465; $found = array_filter($userdb,function($v,$k) use ($search){ return $v['uid'] => $search; }) $values= print_r(array_value($found)); $keys = print_r(array_keys($found));
несмотря на то, что это старый вопрос и имеет принятый ответ, Я бы предложил одно изменение к принятому ответу.. Итак, во-первых, я согласен, что принятый ответ здесь правильный.
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"; }
вот один лайнер для того же,
$pic_square = $userdb[array_search($uid,array_column($userdb, 'uid'))]['pic_square'];
мне пришлось использовать функцию 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; }
/** * 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; }
вы можете использовать эту функцию ; 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 // ) // // )
$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);
просто поделитесь, может быть, это может понравиться.
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; }}
попробуйте это
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; } }
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-массиве, поэтому идентификатор пользователя может быть найден по мере необходимости.
расширяя созданную функцию @mayhem, этот пример будет более "нечетким" поиском, если вы просто хотите сопоставить часть (большинство) в строке поиска:
function searchArrayKeyVal($sKey, $id, $array) { foreach ($array as $key => $val) { if (strpos(strtolower($val[$sKey]), strtolower(trim($id))) !== false) { return $key; } } return false; }например значение в массиве Добро пожаловать в Нью-Йорк! а вы хотели первый экземпляр просто " Нью-Йорк!"
попробуй такое
<?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; } ?>
$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"; } } }
Я хочу проверить tha в следующем массиве
$arrсуществует ли ' abc ' в суб массивах или нет$arr = array( array( 'title' => 'abc' ) );тогда я могу использовать это
$res = array_search('abc', array_column($arr, 'title')); if($res == ''){ echo 'exists'; } else { echo 'notExists'; }Я думаю, что это самый простой способ определить
Если вопрос, т. е.
$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));
Comments