2011-10-08 20 views
20

usando array_search en una matriz bidimensional 1 es sencillausando array_search de matriz multidimensional

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

echo $key; 

pero ¿qué hay de una matriz multidimensional?

#RaceRecord 

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

por ejemplo, quiero obtener el índice del automóvil cuya posición es 1. ¿Cómo hago esto?

+3

Una "matriz asociativa" y una "matriz multidimensional" son dos cosas diferentes. Su ejemplo es una matriz multidimensional que tiene un eje asociativo. – Amber

+0

oh, lo siento, voy a editar el título –

Respuesta

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

+1, PERO creo que debería haber más soluciones fáciles – diEcho

+1

discúlpeme, ¿podría darme algunas aclaraciones? el valor $ position es el valor de Position mientras que $ cars es el array en sí mismo? gracias por la respuesta –

+2

SikretMiseon - sí. @diEcho: ¿qué solución "más fácil" puedes pensar que no sería muy específica para la implementación? – Amber

2

realidad todas las funciones de matriz están diseñados para una sola dimensión array.You siempre hay que tener en cuenta que lo está aplicando en la matriz de dimensión única.

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

No use 'count' en [for loop] (http://www.php.net/ manual/es/control-structures.for.php) – machineaddict

5

Básicamente recreé 'underscore.js's findWhere método que es para morirse.

La función:

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

Ejemplo:

$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' 
)); 

estoy seguro de que este método podría reducir fácilmente LOC. Estoy un poco cansado. : P

8

¡Hooray para one-liners!

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

Esto fue especialmente útil porque estaba buscando todos los índices que contienen un valor, así que todo lo que tuve que hacer fue soltar el '[0]' al final. El método 'array_search ('needle', array_column ($ haystack, 'column_key'));' solo devuelve el primero. – Ricca

+1

Gracias por esta respuesta, esa fue la solución perfecta en una línea, me salvó el día. –

22

en PHP 5.5.5 & versiones posteriores, puede probar esta

$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]); 

muestra de trabajo: http://sandbox.onlinephpfunctions.com/code/19385da11fe0614ef5f84f58b6dae80bd216fc01

Documentación sobre array_column se puede encontrar here

+1

Funciona perfectamente. ¡Gracias! – AnkitK

+0

¿Qué sucede si necesito buscar dónde name = 'snart' y type =' antihero' – Smith

+0

@Smith: Use la respuesta de Loupax y combine sus coincidencias en la declaración de devolución con && – SRB

8

Usted puede tratar

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