Ответ 1
function find_car_with_position($cars, $position) {
foreach($cars as $index => $car) {
if($car['Position'] == $position) return $index;
}
return FALSE;
}
Использование 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]);
Выход:
array(2) { ["name"]=> string(5) "snart" ["type"]=> string(8) "antihero" }
рабочий образец: 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];
Давайте сделаем это более понятным:
array_filter(
$array,
function ($item) {
return $item['property'] === 'whatever';
}
);
возвращает массив, который содержит все элементы, которые удовлетворяют условию в обратном вызове, сохраняя при этом свои оригинальные ключи массива. Нам в основном нужен ключ первого элемента этого массива.
Для этого мы оборачиваем результат в array_keys()
и получаем его первым элементом. Этот конкретный пример предполагает, что существует хотя бы один соответствующий элемент, поэтому вам может потребоваться дополнительная проверка, чтобы быть в безопасности.
Я в основном "воссоздал" 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
фактически все функции массива предназначены для одномерного массива. Вам всегда нужно иметь в виду, что вы применяете его в одномерном массиве.
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....
}
}
}