PHPmultidimensional array按值search

我有一个数组,我想要search的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); 

重要的是要知道,如果你正在使用===运算符比较types必须完全相同,在这个例子中,你必须searchstring或只是使用==而不是===

根据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 <5.5.0,你可以使用这个backport ,谢谢ramsey!

更新:我一直在做一些简单的基准,多个结果表单似乎是最快的,甚至比Jakub自定义函数更快!

build立Jakub的优秀答案 ,这是一个更广义的search,将允许指定键(而不仅仅是用于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进行search。 我只是想分享给任何可能需要该function的人。

这是我的例子,请记住这是我的第一个答案。 我拿出了param数组,因为我只需要search一个特定的数组,但你可以很容易地添加它。我想本质上不仅仅是使用uid进行search。

此外,在我的情况下,可能有多个键作为search的结果可能不是唯一的其他字段返回。

  /** * 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; } 

后来,我写了这个,让我去寻找另一个价值和联想的关键。 所以我的第一个例子允许你在任何特定的关联关键字中search一个值,并返回所有的匹配。

第二个例子显示在某个关联关键字(first_name)中find值('泰勒'),在另一个关联关键字(雇用)中find另一个值(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从multidimensional array(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代码:

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

尽pipe这是一个古老的问题,并且有一个被接受的答案,但是我想我会build议对接受的答案进行一个改变。所以首先,我同意接受的答案在这里是正确的。

 function searchArrayKeyVal($sKey, $id, $array) { foreach ($array as $key => $val) { if ($val[$sKey] == $id) { return $key; } } return false; } 

用函数中的参数代替预设的“uid”,所以现在调用下面的代码意味着你可以在多个数组types中使用这个函数。 小小的变化,但一个微小的差异。

  // 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小提琴示例

看起来array_filter将是适合这个解决scheme…

 $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)); 

在更高版本的PHP(> = 5.5.0)中,您可以使用单行。

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

我不得不使用un函数来查找数组中的每个元素。 所以我修改了JakubTruneček完成的function,如下所示:

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

你可以使用这个function; 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); 

试试这也

 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 

在上面的代码的帮助下,可以find来自二维数组中的任何列的任何(部分匹配的)数据,因此可以根据需要find用户ID。

扩展函数@mayhem创build,这个例子将更多的是“模糊”的search,如果你只是想匹配部分( 大部分 )的searchstring:

  function searchArrayKeyVal($sKey, $id, $array) { foreach ($array as $key => $val) { if (strpos(strtolower($val[$sKey]), strtolower(trim($id))) !== false) { return $key; } } return false; } 

例如数组中的值是Welcome to New York! 你想要的只是“纽约!”的第一个例子!

尝试这个

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

我想检查在下面的数组$arr是否存在'abc'存在子数组或不

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

那我可以用这个

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

我认为这是最简单的定义方式