2012-02-28 36 views
5

Creo que esto ha sido antes, pero no he podido encontrar ninguna respuesta. Si ya está respondida, indícame la dirección correcta con un enlace.Eliminar los primeros niveles de identificador en el conjunto

Tengo una matriz que quiero eliminar los primeros niveles de identificador. Creo que hay una función para esto?

Ejemplo de cómo es:

[0] => Array 
     (
      [8] => Röd 
     ) 

[1] => Array 
     (
      [8] => Blå 
     ) 

[2] => Array 
     (
      [6] => Bobo 
     ) 

[3] => Array 
     (
      [8] => Grön 
     ) 

[4] => Array 
     (
      [7] => Sten 
     ) 

[5] => Array 
     (
      [8] => Vit 
     ) 

[6] => Array 
     (
      [7] => Guld 
     ) 

[7] => Array 
     (
      [6] => Lyxig 
     ) 

Lo que wa no

[8] => Röd 
[8] => Blå 
[6] => Bobo 
[8] => Grön 
[7] => Sten 
[8] => Vit 
[7] => Guld 
[6] => Lyxig 
+0

Creo que estos son los robots que está buscando para: http://stackoverflow.com/questions/1181691/extract-leaf-nodes-of- multi-dimensional-array-in-php – Quasdunk

+0

Terminas con llaves duplicadas ... ¿Pueden "renumerarse" las claves (1, 2, 3, ...?) –

+0

verifica mi respuesta que eliminará los primeros niveles de identificador en array y le dará el resultado exacto –

Respuesta

0
foreach($array as $key=>$val) { 
    $newarr[$val] = $array[$key][$val]; 
} 

no probado!

+2

Se debe agregar que las claves duplicadas no son posibles y se sobrescribirán. – Sgoettschkes

12

El problema aquí es preservar las claves para el identificador que desea. Tiene algunas cadenas de nombres que tienen la misma clave (como Blå y Röd). O necesita almacenarlos en una matriz o estar dispuesto a perder la clave.

Ejemplo con PHP5.3:

$processed = array_map(function($a) { return array_pop($a); }, $arr); 

Esto le dará:

[0] => Röd 
[1] => Blå 
[2] => Bobo 
[3] => Grön 
[4] => Sten 
[5] => Vit 
[6] => Guld 
[7] => Lyxig 

Ha quedado claro las claves de la matriz interna deben ser preservados porque son una especie de Identificación . Dicho esto, debe cambiar la estructura final que está buscando porque puede tener 2 de la misma clave en una sola matriz. La estructura más simple se convierte en:

[8] => Array 
     (
      [0] => Röd, 
      [1] => Blå, 
      [2] => Vit, 
      [3] => Grön 
     ) 

[6] => Array 
     (
      [0] => Bobo, 
      [1] => Lyxig 
     ) 

[7] => Array 
     (
      [0] => Sten, 
      [1] => Guld 
     ) 

Para obtener esta estructura de un bucle sencillo funcionará:

$processed = array(); 
foreach($arr as $subarr) { 
    foreach($subarr as $id => $value) { 
     if(!isset($processed[$id])) { 
     $processed[$id] = array(); 
     } 

     $processed[$id][] = $value; 
    } 
} 
+0

Buena solución y buena detección del caviat – Luc

+0

Parece una solución muy buena. Pero no puedo hacer que funcione. Ingresando la matriz como lo indica en el $ arr. Obtenga el siguiente mensaje: array_map() espera que el parámetro 1 sea una devolución de llamada válida, el primer miembro de la matriz no es un nombre de clase u objeto válido. Tengo el siguiente código ' array ( "8"=> "Vit" ), "6"=> array ( "7" => "Guld" ) ); $ procesada = array_map ($ arrData, \t función ($ a) \t { \t \t array_pop retorno ($ a); \t}); print_r ($ procesado); ?> – Fredrik

+0

lo siento voltear los argumentos alrededor :-) Actualizado mi respuesta. – prodigitalson

0

mira esto es lo esperado resultado uso

<?php 
$arrData = array(
"5" => array 
     (
      "8" => "Vit" 
     ), 

"6" => array 
     (
      "7" => "Guld" 
     ) 
); 
foreach($arrData as $key=>$value): 
    foreach($value as $k=>$v): 
    $data[$k] = implode(',',$arrData[$key]); 
    endforeach; 
endforeach; 


print_r($data); 
?> 
1

:

public function remove_level($array) { 
     $result = array(); 
     foreach ($array as $key => $value) { 
     if (is_array($value)) { 
      $result = array_merge($result, $value); 
     } 
     } 
     return $result; 
} 

que devolverá valores de matriz de segundo nivel en el mismo orden que la matriz original. o puede utilizar array_walk

$results = array(); 
    array_walk($array, function($v, $k) use($key, &$val){ 
       array_merge($results, $v); 
    }); 
3

PHP array_column

$new_array = array_column($old_array,0); 

Esto recuperará el valor en el índice 0 para cada matriz dentro de $ old_array. También se puede usar con matrices asociativas.

0

intenta combinar conjunto con el operador splat:

print_r(array_merge(...$array)); 
+0

Agregue una descripción sobre cómo la respuesta propuesta resolverá el problema. – Billa

Cuestiones relacionadas