2011-10-08 161 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'));