Поиск многомерного массива 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 .

Я пробовал создавать циклы, но мне нужен более быстрый исполняемый код.

 function searchForId($id, $array) { foreach ($array as $key => $val) { if ($val['uid'] === $id) { return $key; } } return null; } 

Это сработает. Вы должны называть это следующим образом:

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

Важно знать, что если вы используете === сравниваемые типы операторов должны быть точно такими же, в этом примере вам нужно искать string или просто использовать == вместо === .

На основании ответа ангору . В более поздних версиях 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 <5.5.0, вы можете использовать этот backport , спасибо ramsey!

Обновление. Я делаю несколько простых тестов, и форма с несколькими результатами, кажется, самая быстрая, даже быстрее, чем пользовательская функция 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.

Кроме того, в моей ситуации может быть несколько ключей для возврата в результате поиска другими полями, которые могут быть не уникальными.

  /** * Search Revisions * @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. */ public function search_revisions($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 ($this->revisions as $key => $cur_value) { if ($cur_value[$key_to_search] === $search_value) { $keys[] = $key; } } return $keys; } 

Позже я закончил писать это, чтобы позволить мне искать другое значение и ассоциативный ключ. Поэтому мой первый пример позволяет вам искать значение в любом конкретном ассоциативном ключе и возвращать все совпадения.

В этом втором примере показано, где значение («Тейлор») найдено в определенном ассоциативном ключе (first_name). И другое значение (true) найдено в другом ассоциативном ключе (используется) и возвращает все соответствия (Ключи, в которых люди с именем «Тейлор» И используются).

 /** * Search Revisions * @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. */ public function search_revisions($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 ($this->revisions 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; } 

Я изменил один из примеров ниже описание функции 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; } 

Looks 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"; } 

Пример скрипта PHP

В более поздних версиях PHP (> = 5.5.0) вы можете использовать однострочный.

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

Мне пришлось использовать функцию 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 // ) // // ) в <?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); 

Попробуйте это также

 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 в sub-массивах или нет

 $arr = array( array( 'title' => 'abc' ) ); 

Тогда я могу использовать это

 $res = array_search('abc', array_column($arr, 'title')); if($res == ''){ echo 'exists'; } else { echo 'notExists'; } 

Я думаю, что это самый простой способ определить

Вот один лайнер для того же,

 $pic_square = $userdb[array_search($uid,array_column($userdb, 'uid'))]['pic_square'];