2010-05-28 21 views
5

¿Hay alguna manera rápida de aplanar una matriz y seleccionar subclaves ('clave' & 'valor' en este caso) sin ejecutar un bucle foreach, o es foreach siempre la manera más rápida?PHP: aplana la matriz de la manera más rápida?

Array 
(
    [0] => Array 
     (
      [key] => string 
      [value] => a simple string 
      [cas] => 0 
     ) 

    [1] => Array 
     (
      [key] => int 
      [value] => 99 
      [cas] => 0 
     ) 

    [2] => Array 
     (
      [key] => array 
      [value] => Array 
       (
        [0] => 11 
        [1] => 12 
       ) 

      [cas] => 0 
     ) 

) 

Para:

Array 
(
    [int] => 99 
    [string] => a simple string 
    [array] => Array 
     (
      [0] => 11 
      [1] => 12 
     ) 
) 
+3

duplicado: http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array Creo que esta respuesta le ayudará a los más : http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array/1320156#1320156 –

+0

¿Alguna razón para hacerlo "más rápido"? –

+0

¿Alguna razón por la que no querías usar 'foreach'? – salathe

Respuesta

3

dar a este un tiro:

$ret = array(); 
while ($el = each($array)) { 
    $ret[$el['value']['key']] = $el['value']['value']; 
} 
+1

oh qué operadores antiguos :) –

+0

Yo recomendaría siempre inicializar el iterador de array usando 'reset ($ array)' justo antes de iterar de esa manera, para evitar que otra llamada, p. 'end()' se habría metido con eso. Muchas formas de caer en esa trampa ... –

+0

Pruebe esta solución: http://stackoverflow.com/a/1320259/1847769 – t1gor

3

call_user_func_array("array_merge", $subarrays) se puede utilizar para "aplanar" conjuntos anidados.
Lo que quieres es algo completamente diferente. Puede utilizar array_walk() con una devolución de llamada en su lugar para extraer los datos en el formato deseado. Pero no, el ciclo foreach es aún más rápido. No existe el método array_* para lograr su estructura de lo contrario.

+0

array_walk no funcionaría en sí mismo, ya que no devuelve nada excepto un bool (y no puedes modificar la clave de la matriz). – ircmaxell

-1

Esto debería combinar correctamente matrices con claves enteras. Si las claves son contiguas y comienzan en cero, se descartarán. Si aún no existe una clave entera en la matriz plana, se mantendrá tal como está; esto debería preservar principalmente las matrices no contiguas.

function array_flatten(/* ... */) 
{ 
    $flat = array(); 
    array_walk_recursive(func_get_args(), function($value, $key) 
    { 
     if (array_key_exists($key, $flat)) 
     { 
      if (is_int($key)) 
      { 
       $flat[] = $value; 
      } 
     } 
     else 
     { 
      $flat[$key] = $value; 
     } 
    }); 
    return $flat; 
} 

Usted podría utilizar !isset($key) o empty($key) en lugar de favorecer los valores útiles.

Aquí hay una versión más concisa:

function array_flatten(/* ... */) 
{ 
    $flat = array(); 
    array_walk_recursive(func_get_args(), function($value, $key) use (&$flat) 
    { 
     $flat = array_merge($flat, array($key => $value)); 
    }); 
    return $flat; 
} 
Cuestiones relacionadas