web-dev-qa-db-fra.com

utilisation de array_search pour un tableau multidimensionnel

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?

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

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

45
SRB

Vous pouvez essayer ceci

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

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.

8
Loupax

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

5
Michael J. Calkins

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....
        }
    }
}
2
Rukmi Patel