2009-09-21 14 views
17

Quiero generar una lista del segundo nivel de claves utilizadas. Cada registro no contiene todas las mismas claves. Pero necesito saber cuáles son todas las claves. array_keys() no funciona, solo devuelve una lista de números.Buscar todas las claves de segundo nivel en matriz multidimensional en php

Esencialmente la salida Im que busca es:

acción, identificación, validación, Base, Ebase, ftype, Cantidad, Tipo, Etiqueta, Unidad

Tengo una matriz multidimensional grande que sigue la formato:

Array 
(
    [0] => Array 
     (
      [action] => A 
      [id] => 1 
      [validate] => yes 
      [Base] => Array 
       (
        [id] => 2945 
       ) 

      [EBase] => Array 
       (
        [id] => 398 
       ) 

      [Qty] => 1 
      [Type] => Array 
       (
        [id] => 12027 
       ) 

      [Label] => asfhjaflksdkfhalsdfasdfasdf 
      [Unit] => asdfas 
     ) 

    [1] => Array 
     (
      [action] => A 
      [id] => 2 
      [validate] => yes 
      [Base] => Array 
       (
        [id] => 1986 
       ) 

      [FType] => Array 
       (
        [id] => 6 
       ) 

      [Qty] => 1 
      [Type] => Array 
       (
        [id] => 13835 
       ) 

      [Label] => asdssdasasdf 
      [Unit] => asdger 
     ) 
) 

¡Gracias por la ayuda!

Respuesta

17
<?php 

// Gets a list of all the 2nd-level keys in the array 
function getL2Keys($array) 
{ 
    $result = array(); 
    foreach($array as $sub) { 
     $result = array_merge($result, $sub); 
    }   
    return array_keys($result); 
} 

?> 

edición: función

+0

Funciona muy bien, no es necesario verificar los valores de las claves repetidas ! – user103219

+0

¿Por qué la llamada a 'array_reverse()'? –

+0

@gunderwonder - convierte las claves en valores - para que array_merge() fusione todas las claves juntas –

6
foreach($bigArray as $array){  
    foreach($array as $key=>$value){ 
     echo $key; 
    } 
} 

Eso debería hacer lo que quiera.

+0

gracias inkedmn - Intenté por primera vez su primera versión (antes de su edición) y obviamente no funcionó. Este funcionó bien, luego una simple declaración if para buscar duplicados y tuve mis datos. – user103219

5

¿Qué pasa algo como esto:

$your_keys = array_keys($your_array[0]); 

Por supuesto, esto está considerando todas las sub-series tienen las mismas claves; en este caso, sólo necesita las llaves del primer sub-conjunto (sin necesidad de iterar sobre todos los sub-conjuntos de primer nivel, supongo)


Y, como ejemplo/simplificada acortada:

$your_array = array(
    array(
     'action' => 'A', 
     'id' => 1, 
     'base' => array('id' => 145), 
    ), 
    array(
     'action' => 'B', 
     'id' => 2, 
     'base' => array('id' => 145), 
    ), 
    array(
     'action' => 'C', 
     'id' => 3, 
     'base' => array('id' => 145), 
    ) 
); 

$your_keys = array_keys($your_array[0]); 
var_dump($your_keys); 

le conseguirá:

array 
    0 => string 'action' (length=6) 
    1 => string 'id' (length=2) 
    2 => string 'base' (length=4) 

puede el uso implode a obtener la cadena que pidió:

echo implode(', ', $your_keys); 

le conseguirá:

action, id, base 

es decir, la lista de las claves de la primera sub-matriz.

+0

Gracias, Pascal lamentablemente, cada conjunto no contiene las mismas claves. – user103219

+0

Ho, lástima :-(En este caso, ¿qué pasa con el uso de array_keys en cada sub-array, y, a continuación, array_merge en las listas de claves de esas sub-arrays? –

7
array_keys(call_user_func_array('array_merge', $a)); 

Fusiona todos los valores y recupera las claves resultantes.

1
function __getAll2Keys($array_val){ 
     $result = array(); 
     $firstKeys = array_keys($array_val); 
     for($i=0;$i<count($firstKeys);$i++){ 
      $key = $firstKeys[$i]; 
      $result = array_merge($result,array_keys($array_val[$key])); 
     } 
     return $result; 
    } 

() eliminado array_reverse superfluo tratar esta función. Volverá como quieras.

0

Quizás pueda usar la función array_map, que le permite evitar la iteración de matriz y devolver una matriz con las claves que necesita como valores.

será así

$newArray = array_map(function($value){return array_keys($value);},$yourArray); 

var_dump($newArray); 

array (size=2) 
    0 => 
    array (size=9) 
     0 => string 'action' (length=6) 
     1 => string 'id' (length=2) 
     2 => string 'validate' (length=8) 
     3 => string 'Base' (length=4) 
     4 => string 'EBase' (length=5) 
     5 => string 'Qty' (length=3) 
     6 => string 'Type' (length=4) 
     7 => string 'Label' (length=5) 
     8 => string 'Unit' (length=4) 
    1 => 
    array (size=9) 
     0 => string 'action' (length=6) 
     1 => string 'id' (length=2) 
     2 => string 'validate' (length=8) 
     3 => string 'Base' (length=4) 
     4 => string 'FType' (length=5) 
     5 => string 'Qty' (length=3) 
     6 => string 'Type' (length=4) 
     7 => string 'Label' (length=5) 
     8 => string 'Unit' (length=4) 
+0

que simplemente cambia las claves para que sean valores – Hontoni

3

Un forro:

$keys=array_unique(array_reduce(array_map('array_keys',$data),'array_merge',[])); 

O en una función:

function get_array_children_keys($data) { 
    return array_unique(
     array_reduce(array_map('array_keys', $data), 'array_merge', []) 
    ); 
} 

Ahora vamos a descomponerlo con un ejemplo, he aquí algo de la muestra datos:

[ 
    ['key1' => 0], 
    ['key1' => 0, 'key2' => 0], 
    ['key3' => 0] 
] 

A partir de la mayoría de la función interna, corremos array_map con la función array_keys:

array_map('array_keys', $data) 

Esto nos da las claves de de todas las matrices niño

[ 
    ['key1'], 
    ['key1', 'key2'], 
    ['key3'] 
] 

corremos el array_reduce en el datos con la devolución de llamada array_merge y una matriz vacía como el valor inicial:

array_reduce(..., 'array_merge', []); 

This conve RTS nuestros múltiples arreglos en 1 conjunto plano:

[ 
    'key1', 
    'key1', 
    'key2', 
    'key3' 
] 

Ahora nos tira a nuestros duplicados con array_unique:

array_unique(...) 

y terminar con todas las teclas:

[ 
    'key1', 
    'key2', 
    'key3' 
] 
0

Con esta función puede obtener todas las claves de una matriz multidimensional

function arrayKeys($array, &$keys = array()) {   
     foreach ($array as $key => $value) { 
      $keys[] = $key; 
      if (is_array($value)) {     
       $this->arrayKeys($value, $keys); 
      } 
     } 
     return $keys; 
} 
0

Mientras @raise answers proporciona un acceso directo, falla con las teclas numéricas. Lo que sigue debe resolver este:

$secondKeys=array_unique(call_user_func_array('array_merge', array_map('array_keys',$a))); 

array_map('array_keys',$a) bucles entre al obtener las claves

...'array_merge'...: Combinar la matriz teclas

array_unique(...: (opcional) Obtener claves únicas.

Espero que ayude a alguien.

ACTUALIZACIÓN:

Alternativamente, puede utilizar

$secondKeys=array_unique(array_merge(...array_map('array_keys', $a))); 

que proporciona misma respuesta que antes, y mucho más rápido.

Cuestiones relacionadas