использование array_search для многомерного массива

использование array_search в 1-мерном массиве прост

$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. Как мне это сделать?

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

В 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 можно найти здесь

Вы можете попробовать это

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

Ура для однострочных!

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

Я в основном «воссоздал» метод 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. Я немного устал. :П

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

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