2010-05-31 21 views
7

uso de un marco de propiedad, con frecuencia me encontrarme en la situación donde consigo un conjunto de resultados de la base de datos en el siguiente formato:PHP matrices: Pop una matriz de matrices de un solo elemento en una matriz

array(5) { 
    [0] => array(1) { 
    ["id"] => int(241) 
    } 
    [1] => array(1) { 
    ["id"] => int(2) 
    } 
    [2] => array(1) { 
    ["id"] => int(81) 
    } 
    [3] => array(1) { 
    ["id"] => int(560) 
    } 
    [4] => array(1) { 
    ["id"] => int(10) 
    } 
} 

Prefiero tener una sola tabla de id, tales como:

array(5) { 
    [0] => int(241) 
    [1] => int(2) 
    [2] => int(81) 
    [3] => int(560) 
    [4] => int(10) 
} 

para llegar allí, con frecuencia me encuentro escribiendo:

$justIds = array(); 
foreach($allIds as $id) { 
    $justIds[] = $id["id"]; 
} 

¿Hay una manera más eficiente de hacer esto?

+1

¿Está utilizando el buen método? En la mayoría de los marcos, hay métodos como fetchCol() para manejar los casos especiales de 1-dimensonal ... – greg0ire

+0

Es el caso de que esté disponible un método de estilo fetchCol(), pero en muchos casos no controlo lo que realmente está buscando la información de la base de datos (llamadas API, etc.). –

Respuesta

9
$out = array_map('array_shift', $in); 

e.g.

$in = array(
    array("id" => 241), 
    array ("id" => 2), 
    array ("id" => 81), 
    array ("id" => 560), 
    array ("id" => 10) 
); 
$out = array_map('array_shift', $in); 
var_dump($out); 

impresiones

array(5) { 
    [0]=> 
    int(241) 
    [1]=> 
    int(2) 
    [2]=> 
    int(81) 
    [3]=> 
    int(560) 
    [4]=> 
    int(10) 
} 
+0

Probablemente sería más eficiente usar 'reset' en su lugar porque' array_shift' cambia la matriz pasada. EDITAR: recién probado, usar 'reiniciar' da una mejora del 6% con su ejemplo en mi compilación de depuración de Windows. – Artefacto

+0

¿Cómo sería una solución usando reinicio? –

+0

Simplemente reemplace 'array_shift' por' reset'. – VolkerK

6

Con PHP 5.3 que puede hacer

$justIds = array_map(
    function($cur) { 
     return $cur['id']; 
    }, 
    $allIds 
); 

Con PHP 5.3 < que tendrías definir una función regular y luego pasar el nombre como una cadena de array_map ()

+0

En realidad, la versión de VolkerK con array_shift podría ser mejor que mi devolución de llamada personalizada – johannes

+0

Por otro lado, esta versión funciona incluso si la matriz de entrada contiene matrices con más de un elemento independientemente del orden. +1 – VolkerK

+0

Marqué VolkerK como la mejor respuesta porque aborda el ejemplo específico, pero hay suficientes ocasiones en las que necesitaré manejar subconjuntos de múltiples elementos para poder agregar ambas técnicas a mi arsenal. ¡Gracias a ambos! –

Cuestiones relacionadas