php - puede - utilizando array_search para matriz multidimensional
obtener el valor de un array php (6)
¡Hurra por una sola línea!
$index = array_keys(array_filter($array, function($item){ return $item[''property''] === ''whatever'';}))[0];
Vamos a dejarlo más claro:
array_filter(
$array,
function ($item) {
return $item[''property''] === ''whatever'';
}
);
devuelve una matriz que contiene todos los elementos que cumplen la condición en la devolución de llamada, manteniendo sus claves de matriz originales. Básicamente necesitamos la clave del primer elemento de esa matriz.
Para hacer esto array_keys()
el resultado en una llamada array_keys()
y obtenemos su primer elemento. Este ejemplo específico asume que existe al menos un elemento coincidente, por lo que es posible que necesite un control adicional para estar seguro.
el uso de array_search en una matriz unidimensional es simple
$array = array("apple", "banana", "cherry");
$searchValue = "cherry";
$key = array_search($searchValue, $array);
echo $key;
pero ¿qué tal 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?
Básicamente ''recreado'' el método findWhere de underscore.js 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 la LOC. Estoy un poco cansado. :PAG
En PHP 5.5.5 y versiones posteriores, puedes probar esto
$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
La documentación sobre array_column se puede encontrar here
Puedes probar esto
array_search(1, array_column($cars, ''position''));
en realidad, todas las funciones de matriz están diseñadas para una matriz de dimensión única. Siempre debe tener en cuenta que la está aplicando en una 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....
}
}
}
function find_car_with_position($cars, $position) {
foreach($cars as $index => $car) {
if($car[''Position''] == $position) return $index;
}
return FALSE;
}