valor puede para obtener multidimensional indice extraer emplear elemento datos buscar array_column array php arrays

puede - ¿Hay una función para extraer una ''columna'' de una matriz en PHP?



obtener el indice de un array php (15)

Tengo una matriz de matrices, con la siguiente estructura:

array(array(''page'' => ''page1'', ''name'' => ''pagename1'') array(''page'' => ''page2'', ''name'' => ''pagename2'') array(''page'' => ''page3'', ''name'' => ''pagename3''))

¿Hay una función incorporada que devolverá una nueva matriz con solo los valores de las teclas ''nombre''? entonces obtendría:

array(''pagename1'', ''pagename2'', ''pagename3'')


prueba esto

<?php $array=array(array(''page'' => ''page1'', ''name'' => ''pagename1''), array(''page'' => ''page2'', ''name'' => ''pagename2''), array(''page'' => ''page3'', ''name'' => ''pagename3'')); $name = array_column($array, ''name''); print_r($name); ?>


¿Por qué tiene que ser una función incorporada? No, no hay ninguno, escribe el tuyo.

Aquí hay uno agradable y fácil, a diferencia de otros en este hilo.

$namearray = array(); foreach ($array as $item) { $namearray[] = $item[''name'']; }


¿Te refieres a array_values ?

Editar: Gracias por el voto negativo sin comentarios. Si alguien se hubiera tomado el tiempo de mirar la documentación de la función, habría visto el primer comentario que da un ejemplo de cómo escribir su propia función array_values_recursive. Combina eso con un array_walk y tendrías una función bastante ingeniosa que no tendría la columna ''nombre'' codificada en ella. Sheesh.


A partir de PHP 5.5 , puede usar array_column() :

<?php $samples=array( array(''page'' => ''page1'', ''name'' => ''pagename1''), array(''page'' => ''page2'', ''name'' => ''pagename2''), array(''page'' => ''page3'', ''name'' => ''pagename3'') ); $names = array_column($samples, ''name''); print_r($names);

Véalo en acción


Aquí hay una forma funcional de hacerlo:

$data = array( array(''page'' => ''page1'', ''name'' => ''pagename1''), array(''page'' => ''page2'', ''name'' => ''pagename2''), array(''page'' => ''page3'', ''name'' => ''pagename3'')); $result = array_map(create_function(''$arr'', ''return $arr["name"];''), $data); print_r($result);


Bueno, hay. Al menos para PHP> 5.5.0 y se llama array_column

La función PHP toma un parámetro $index_key opcional que, según el sitio web PHP, establece:

$index_key

La columna para usar como índice / claves para la matriz devuelta. Este valor puede ser la clave entera de la columna, o puede ser el nombre de la clave de cadena

En las respuestas aquí, veo una versión eliminada sin el parámetro opcional. Lo necesitaba, entonces, aquí está la función completa:

if (!function_exists(''array_column'')) { function array_column($array, $column, $index_key = null) { $toret = array(); foreach ($array as $key => $value) { if ($index_key === null){ $toret[] = $value[$column]; }else{ $toret[$value[$index_key]] = $value[$column]; } } return $toret; } }



Esta es una llamada bastante fácil para array_reduce.

$valuesOnly = array_reduce($modelData, function ($carry, $item) { return array_merge($carry, $item[''id'']); }, []);


No creo que haya ninguna necesidad de tener una función incorporada para esto. Puede haber una matriz en su matriz.

$samples=array( array(''page'' => ''page1'', ''name'' => ''pagename1''), array(''page'' => ''page2'', ''name'' => ''pagename2''), array(''page'' => ''page3'', ''name'' => ''pagename3'') ); $output1=array(); $output2=array(); foreach($samples as $sample){ array_push($output1,$sample[''name'']); $output2[]=array_splice($sample,1); } print_r($output1); print_r($output2);

en $ output1 es el resultado que desea si solo desea eliminar la parte ''indexación'' de la página y luego $ output2.

si necesita todos los valores de esa matriz e indexa numéricamente la matriz, entonces puede usar

$array_1=array_values($samples);

pero lo que entiendo, no querías esto.


Puede extender la clase ArrayIterator e ignorar el método mixed current(void) .

class Foo extends ArrayIterator { protected $index; public function __construct($array, $index) { parent::__construct($array); $this->index = $index; } public function current() { $c = parent::current(); return isset($c[$this->index]) ? $c[$this->index] : null; } } $a = array( array(''page'' => ''page1'', ''name'' => ''pagename1''), array(''name'' => ''---''), array(''page'' => ''page2'', ''name'' => ''pagename2''), array(''page'' => ''page3'', ''name'' => ''pagename3'') ); $f = new Foo($a, ''page''); foreach($f as $e) { echo $e, "/n"; }

huellas dactilares

page1 page2 page3


Quería publicar aquí, incluso si esta es una pregunta antigua, porque sigue siendo muy relevante y muchos desarrolladores no usan PHP> = 5.5

Digamos que tienes una matriz como esta:

Array ( [files] => Array ( [name] => Array ( [0] => file 1 [1] => file 2 [2] => file 3 ) [size] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [error] => Array ( [0] => abc [1] => def [2] => ghi ) ) )

y el resultado que desea es algo como esto:

Array ( [0] => Array ( [0] => file 1 [1] => 1 [2] => abc ) [1] => Array ( [0] => file 2 [1] => 2 [2] => def ) [2] => Array ( [0] => file 3 [1] => 3 [2] => ghi ) )

Simplemente puede usar el método array_map () sin un nombre de función pasado como el primer parámetro, como ese:

array_map(null, $a[''files''][''name''], $a[''files''][''size''], $a[''files''][''error'']);

Lamentablemente, no puede asignar las claves si pasa más de una matriz.


Sí, hay una función incorporada de PHP llamada array_column que hace lo que estás buscando.

Lo llamarías algo así como $name_keys = array_column($array, ''name''); para obtener el resultado que está buscando

Consulte la siguiente entrada en el manual de PHP para más detalles:

http://php.net/manual/en/function.array-column.php


Similar a la solución de Fuentesjrs, pero un poco más genérica usando array_walk () con una devolución de llamada personalizada:

// Define the callback function extract_named_sub_elements(&$item, $key, $name) { $item = $item[$name]; } // Test data $original = array( array(''page'' => ''page1'', ''name'' => ''pagename1''), array(''page'' => ''page2'', ''name'' => ''pagename2''), array(''page'' => ''page3'', ''name'' => ''pagename3''), ); // Use a copy, as array_walk() operates directly on the passed in array $copy = $original; // Substitute ''name'' with whatever element you want to extract, e.g. ''page'' array_walk($copy, ''extract_named_sub_elements'', ''name''); print_r($copy);


Solo para ampliar algunas de las respuestas aquí, a partir de PHP 5.5, array_column es lo que desea.

En realidad tiene algunos posibles usos.

Usando la matriz de muestra a continuación, aquí están las diferentes maneras de usar array_column.

$a = array( array(''id'' => ''1'', ''name'' => ''Joe''), array(''id'' => ''2'', ''name'' => ''Jane'') );

Recuperando una sola columna como la matriz

$b = array_column($a, ''name'');

Te daría Observe las teclas automáticas comenzando desde 0, según una matriz normal.

$b[0] = ''Joe''; $b[1] = ''Jane'';

Recuperando la matriz completa con una columna como índice.

$c = array_column($a, NULL, ''id'');

Daría como resultado lo siguiente.

$c[1] = array(''id'' => ''1'', ''name'' => ''Joe''); $c[2] = array(''id'' => ''2'', ''name'' => ''Jane'');

Observe cómo la columna que seleccioné como el tercer parámetro se convierte en la clave para cada elemento y obtengo la matriz completa estableciendo el segundo parámetro en nulo.

Por supuesto, el uso final es establecer tanto el 2 ° como el 3 ° params.

$d = array_column($a, ''name'', ''id'');

Te daría lo siguiente.

$d[1] = ''Joe''; $d[2] = ''Jane'';

Yo personalmente uso los 3 parámetros completos para crear listas de opciones seleccionadas. Si tengo una tabla con mis opciones, consulto la tabla y obtengo el resultado y lo paso a esto para obtener una lista con la clave como el valor y la etiqueta. Esta es una manera brillante de crear conjuntos de información que también deben cruzarse por el índice.


if (!function_exists(''array_column'')) { function array_column($array,$column) { $col = array(); foreach ($array as $k => $v) { $col[]=$v[$column]; } return $col; } }

Esto debería funcionar para las versiones de php <5.5 y degradarse en caso de que exista la función