2011-10-08 18 views
20

utilizzando array_search in una matrice bidimensionale 1 è sempliceusando array_search multi matrice bidimensionale

$array = array("apple", "banana", "cherry"); 
$searchValue = "cherry"; 
$key = array_search($searchValue, $array); 

echo $key; 

ma come un array multidimensionale?

#RaceRecord 

    [CarID] [ColorID] [Position] 
[0] 1  1   3 
[1] 2  1   1 
[2] 3  2   4 
[3] 4  2   2 
[4] 5  3   5 

per esempio voglio ottenere l'indice della macchina la cui posizione è 1. Come faccio questo?

+3

Un "array associativo" e un "array multidimensionale" sono due cose diverse. Il tuo esempio è un array multidimensionale che sembra avere un asse associativo. – Amber

+0

oh, mi dispiace, sto per modificare il titolo –

risposta

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

+1, ma penso che ci dovrebbero essere soluzioni più facili – diEcho

+1

scusa, potrei avere dei chiarimenti? il valore $ position è il valore di Position mentre $ cars è la matrice stessa? grazie per la risposta –

+2

SikretMiseon - sì. @diEcho: quale soluzione "più semplice" puoi pensare che non sarebbe molto specifica per l'implementazione? – Amber

2

in realtà tutte le funzioni di array sono progettate per array a singola dimensione. È sempre necessario tenere presente che lo si sta applicando su array a dimensione singola.

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

Non usare 'count' in [for loop] (http://www.php.net/ manual/it/control-structures.for.php) – machineaddict

5

Io fondamentalmente 'ricreato' metodo findWhere delle underscore.js che è da morire.

La funzione:

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

Esempio:

$cars = array(
    array('id' => 1, 'name' => 'Toyota'), 
    array('id' => 2, 'name' => 'Ford') 
); 

$car = findWhere($cars, array('id' => 1)); 

o

$car = findWhere($cars, array(
    'id' => 1, 
    'name' => 'Toyota' 
)); 

Sono sicuro che questo metodo potrebbe facilmente ridurre LOC. Sono un po 'stanco. : P

8

Urrante per one-liner!

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

Questo è stato particolarmente utile perché stavo cercando tutti gli indici che contengono un valore, quindi tutto quello che dovevo fare era eliminare il '[0]' alla fine. Il metodo 'array_search ('needle', array_column ($ haystack, 'column_key'));' restituisce solo il primo. – Ricca

+1

Grazie per questa risposta, è stata una soluzione perfetta in una sola riga, mi hai salvato la giornata. –

22

in PHP 5.5.5 & versioni successive, si può provare questo campione di lavoro

$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

Documentazione su array_column può essere trovato here

+1

Funziona perfettamente. Grazie! – AnkitK

+0

e se devo cercare dov'è name = 'snart' e type =' antihero' – Smith

+0

@Smith: usa la risposta di Loupax e combina le tue corrispondenze nella dichiarazione di ritorno con && – SRB

8

Si può provare questo

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