Tengo esta matriz multidimensional. Necesito buscarlo y devolver solo la clave que coincida con el valor de "slug". Sé que hay otros hilos sobre la búsqueda de matrices multidimensionales, pero realmente no entiendo lo suficiente como para aplicar a mi situación. ¡Muchas gracias por la ayuda!
Entonces necesito una función como:
myfunction($products,'breville-one-touch-tea-maker-BTM800XL');
// returns 1
Aquí está la matriz:
$products = array (
1 => array(
'name' => 'The Breville One-Touch Tea Maker',
'slug' => 'breville-one-touch-tea-maker-BTM800XL',
'shortname' => 'The One-Touch Tea Maker',
'listprice' => '299.99',
'price' => '249.99',
'rating' => '9.5',
'reviews' => '81',
'buyurl' => 'http://www.amazon.com/The-Breville-One-Touch-Tea-Maker/dp/B003LNOPSG',
'videoref1' => 'xNb-FOTJY1c',
'videoref2' => 'WAyk-O2B6F8',
'image' => '812BpgHhjBML.jpg',
'related1' => '2',
'related2' => '3',
'related3' => '4',
'bestbuy' => '1',
'quote' => '',
'quoteautor' => 'K. Martino',
),
2 => array(
'name' => 'Breville Variable-Temperature Kettle BKE820XL',
'slug' => 'breville-variable-temperature-kettle-BKE820XL',
'shortname' => 'Variable Temperature Kettle',
'listprice' => '199.99',
'price' => '129.99',
'rating' => '9',
'reviews' => '78',
'buyurl' => 'http://www.amazon.com/Breville-BKE820XL-Variable-Temperature-1-8-Liter-Kettle/dp/B001DYERBK',
'videoref1' => 'oyZWBD83xeE',
'image' => '41y2B8jSKmwL.jpg',
'related1' => '3',
'related2' => '4',
'related3' => '5',
'bestbuy' => '1',
'quote' => '',
'quoteautor' => '',
),
);
php
search
multidimensional-array
key
Ben Kouba
fuente
fuente
if (myfunction($array, 'field', 'value') !== FALSE )) // do something...
Otra posible solución se basa en la
array_search()
función. Usted necesita usar PHP 5.5.0 o superior.Ejemplo
Explicación
La función
array_search()
tiene dos argumentos. El primero es el valor que desea buscar. El segundo es donde debe buscar la función. La funciónarray_column()
obtiene los valores de los elementos cuya clave es'uid'
.Resumen
Entonces podrías usarlo como:
o, si lo prefiere:
El ejemplo original (por xfoxawy) se puede encontrar en DOCS .
La
array_column()
pagina .Actualizar
Debido al comentario de Vael tuve curiosidad, por lo que hice una prueba simple para medir el desempeño del método que utiliza
array_search
y el método propuesto sobre la respuesta aceptada.Creé una matriz que contenía 1000 matrices, la estructura era así (todos los datos fueron aleatorios):
Ejecuté la prueba de búsqueda 100 veces buscando diferentes valores para el campo de nombre, y luego calculé el tiempo medio en milisegundos . Aquí puedes ver un ejemplo.
Los resultados fueron que el método propuesto en esta respuesta necesitaba alrededor de 2E-7 para encontrar el valor, mientras que el método de respuesta aceptado necesitaba alrededor de 8E-7.
Como dije antes, ambas ocasiones son bastante aceptables para una aplicación que usa una matriz con este tamaño. Si el tamaño crece mucho, digamos 1 millón de elementos, esta pequeña diferencia también aumentará.
Actualización II
Agregué una prueba para el método basado en el
array_walk_recursive
que se mencionó y en algunas de las respuestas aquí. El resultado obtenido es el correcto. Y si nos centramos en el rendimiento, es un poco peor que los otros examinados en la prueba . En la prueba, puede ver que es aproximadamente 10 veces más lento que el método basado enarray_search
. Nuevamente, esta no es una diferencia muy relevante para la mayoría de las aplicaciones.Actualización III
Gracias a @mickmackusa por detectar varias limitaciones en este método:
fuente
array_search()
conarray_column()
no funcionará en la matriz de muestra del OP porque las claves de la submatriz comienzan desde1
. Este método también fallará en claves asociativas. Este método solo funcionará en subarreglos indexados (comenzando desde0
y con claves ascendentes consecutivas). La razón de esto es porquearray_column()
generará nuevos índices en su matriz devuelta.Este método de clase puede buscar en una matriz por múltiples condiciones:
Producirá:
fuente
Utilice esta función:
y función de llamada.
fuente
fuente
Para el próximo visitante que venga: use la matriz recursiva walk; visita cada "hoja" en la matriz multidimensional. Aquí tienes inspiración:
fuente
Me gustaría a continuación, dónde
$products
está la matriz real dada en el problema al principio.fuente
Prueba esto
fuente
&&
y en||
lugar deAND
yOR
en su condición. No hay razón para declararcurrent_key
. La comparación$needle
debe ser estricta.