utiliser array_search dans un tableau à 1 dimension est simple
$array = array("Apple", "banana", "cherry");
$searchValue = "cherry";
$key = array_search($searchValue, $array);
echo $key;
mais que diriez-vous d'un tableau multidimensionnel?
#RaceRecord
[CarID] [ColorID] [Position]
[0] 1 1 3
[1] 2 1 1
[2] 3 2 4
[3] 4 2 2
[4] 5 3 5
par exemple, je veux obtenir l'indice de la voiture dont la position est 1. Comment dois-je procéder?
function find_car_with_position($cars, $position) {
foreach($cars as $index => $car) {
if($car['Position'] == $position) return $index;
}
return FALSE;
}
Dans php 5.5.5 et versions ultérieures, vous pouvez essayer ceci
$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]);
Production:
array(2) { ["name"]=> string(5) "snart" ["type"]=> string(8) "antihero" }
exemple de travail: http://sandbox.onlinephpfunctions.com/code/19385da11fe0614ef5f84f58b6dae80bd216fc01
La documentation sur array_column peut être trouvée ici
Vous pouvez essayer ceci
array_search(1, array_column($cars, 'position'));
Hourra pour les monoplaces!
$index = array_keys(array_filter($array, function($item){ return $item['property'] === 'whatever';}))[0];
Soyons plus clairs:
array_filter(
$array,
function ($item) {
return $item['property'] === 'whatever';
}
);
renvoie un tableau qui contient tous les éléments qui remplissent la condition du rappel, tout en conservant leurs clés de tableau d'origine. Nous avons essentiellement besoin de la clé du premier élément de ce tableau.
Pour ce faire, nous enveloppons le résultat dans un appel array_keys()
et obtenons son premier élément. Cet exemple spécifique fait l'hypothèse qu'au moins un élément correspondant existe, vous pourriez donc avoir besoin d'une vérification supplémentaire juste pour être sûr.
J'ai essentiellement "recréé" la méthode findWhere de underscore.js qui est à tomber par terre.
La fonction:
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;
}
Exemple:
$cars = array(
array('id' => 1, 'name' => 'Toyota'),
array('id' => 2, 'name' => 'Ford')
);
$car = findWhere($cars, array('id' => 1));
ou
$car = findWhere($cars, array(
'id' => 1,
'name' => 'Toyota'
));
Je suis sûr que cette méthode pourrait facilement réduire le LOC. Je suis un peu fatigué. : P
en fait, toutes les fonctions de tableau sont conçues pour un tableau à une dimension. Vous devez toujours garder à l'esprit que vous l'appliquez sur un tableau à une dimension.
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....
}
}
}