2011-10-08 163 views
20

使用array_search是简单在一个1个维阵列使用array_search多维阵列

$array = array("apple", "banana", "cherry"); 
$searchValue = "cherry"; 
$key = array_search($searchValue, $array); 

echo $key; 

但如何一个多维阵列?

#RaceRecord 

    [CarID] [ColorID] [Position] 
[0] 1  1   3 
[1] 2  1   1 
[2] 3  2   4 
[3] 4  2   2 
[4] 5  3   5 

例如,我想获得位置为1的汽车的索引。我该怎么做?

+3

“关联数组”和“多维数组”是两个不同的东西。你的例子是一个多维数组,恰好有一个轴是关联的。 – Amber

+0

哦,我看到对不起,我要编辑标题 –

回答

29
function find_car_with_position($cars, $position) { 
    foreach($cars as $index => $car) { 
     if($car['Position'] == $position) return $index; 
    } 
    return FALSE; 
} 
+2

+1,但我认为应该有更简单的解决方案 – diEcho

+1

请问,我可以有一些澄清? $ position值是Position的值,而$ cars是数组本身?谢谢你的回复 –

+2

SikretMiseon - 是的。 @diEcho - 你认为哪种“更简单”的解决方案不会特别针对实现? – Amber

2

实际上所有的数组函数都是为单维数组设计的。您总是需要记住您正在将其应用于单维数组。

function find_car_with_position($cars, $position) { 
    for($i=0;$i<count($cars);$i++){ 
     if(array_search($search_val, $cars[$i]) === false){ 
      // if value not found in array..... 
     } 
     else{ 
      // if value is found in array.... 
     } 
    } 
} 
+3

不要在[for循环]中使用'count'(http://www.php.net/ manual/en/control-structures.for.php) – machineaddict

5

我基本上'重新创建'underscore.js的findWhere方法是死的。

功能:

function findWhere($array, $matching) { 
    foreach ($array as $item) { 
     $is_match = true; 
     foreach ($matching as $key => $value) { 

      if (is_object($item)) { 
       if (! isset($item->$key)) { 
        $is_match = false; 
        break; 
       } 
      } else { 
       if (! isset($item[$key])) { 
        $is_match = false; 
        break; 
       } 
      } 

      if (is_object($item)) { 
       if ($item->$key != $value) { 
        $is_match = false; 
        break; 
       } 
      } else { 
       if ($item[$key] != $value) { 
        $is_match = false; 
        break; 
       } 
      } 
     } 

     if ($is_match) { 
      return $item; 
     } 
    } 

    return false; 
} 

例子:

$cars = array(
    array('id' => 1, 'name' => 'Toyota'), 
    array('id' => 2, 'name' => 'Ford') 
); 

$car = findWhere($cars, array('id' => 1)); 

$car = findWhere($cars, array(
    'id' => 1, 
    'name' => 'Toyota' 
)); 

我敢肯定,这个方法可以很容易地减少LOC。我有点累。 :P

8

Hooray for one-linerrs!

$index = array_keys(array_filter($array, function($item){ return $item['property'] === 'whatever';}))[0]; 
+0

这是特别方便的,因为我正在寻找所有包含值的索引,所以我只需要在末尾放置'[0]'。 'array_search('needle',array_column($ haystack,'column_key'));'方法只返回第一个。 – Ricca

+1

谢谢你的回答,这是一个完美的解决方案,你已经救了我的一天。 –

22

在PHP 5.5.5 &更高版本, 你可以试试这个

$array_subjected_to_search =array(
array(
     'name' => 'flash', 
     'type' => 'hero' 
    ), 

array(
     'name' => 'zoom', 
     'type' => 'villian' 
    ), 

array(
     'name' => 'snart', 
     'type' => 'antihero' 
    ) 
); 
$key = array_search('snart', array_column($array_subjected_to_search, 'name')); 
var_dump($array_subjected_to_search[$key]); 

工作样本:http://sandbox.onlinephpfunctions.com/code/19385da11fe0614ef5f84f58b6dae80bd216fc01

约array_column文档可以发现here

+1

完美的作品。谢谢! – AnkitK

+0

如果我需要搜索名称='snart'和type ='antihero',那么该怎么办? – Smith

+0

@Smith:使用Loupax的答案并将返回语句中的匹配与&& – SRB

8

你可以试试这

array_search(1, array_column($cars, 'position'));