2010-10-10 5 views
1

j'ai une collection de clés de ce tableau unique plat massif que je voudrais développer essentiellement ce tableau dans un multidimensionnel organisé par les clés - est un exemple ici:php tableau multidimensionnel à partir des valeurs clés connues

'invoice/products/data/item1' 
'invoice/products/data/item2' 
'invoice/products/data/item2' 

=>

'invoice'=>'products'=>array('item1','item2','item3') 

comment puis-je faire cela - la longueur des chaînes ci-dessus sont variables ...

Merci!

+1

' 'facture' => 'produits' => array()' est pas la syntaxe valide. Voulez-vous dire ''invoice' => array ('products' => array())'? – Lekensteyn

+1

est-il toujours 3 dimensions ou peut-il varier? –

+0

Qu'en est-il de * données *? Pourquoi n'est-ce pas 'array ('invoice' => array ('products' => array ('data' => array ('item1', 'item2', 'item3'))))'? – Gumbo

Répondre

2

Quelque chose le long de ces lignes: (N'a pas tester si!) travaille maintenant;)

$data = array(); 
$current = &$data; 
foreach($keys as $value) { 
    $parts = explode("/", $value); 
    $parts_count = count($parts); 
    foreach($parts as $i => $part) { 
    if(!array_key_exists($part, $current)) { 
     if($i == $parts_count - 1) { 
     $current[] = $part; 
     } 
     else { 
     $current[$part] = array(); 
     $current = &$current[$part]; 
     } 
    } 
    else { 
     $current = &$current[$part]; 
    } 
    } 
    $current = &$data; 
} 

clés $ beeing tableau plat.

+0

congrats - fonctionne, merci – ronaktal

0

Bien qu'il soit pas clair de votre question de savoir comment les chaînes séparées «/» traceront à un tableau, l'approche de base sera probablement quelque chose comme ceci:

$result = array(); 
$k1 = $k2 = ''; 
ksort($yourData); // This is the key (!) 
foreach ($yourData as $k => $v) { 
    // Use if/else if/else if to watch for new sub arrays and change 
    // $k1, $k2 accordingly 
    $result[$k1][$k2] = $v; 
} 

Cette approche utilise le ksort pour assurer que les clés au même « niveau » apparaissent ensemble, comme ceci:

'invoice/products/data1/item1' 
'invoice/products/data1/item2' 
'invoice/products/data2/item3' 
'invoice/products2/data3/item4' 
'invoice/products2/data3/item5' 

Remarquez que la ksort correspond au regroupement clé que vous visez.

+0

agréable, fonctionne - légèrement plus rapide – ronaktal

5
$src = array(
'invoice/products/data/item1', 
'invoice/products/data/item2', 
'invoice/products/data/item2', 
'foo/bar/baz', 
'aaa/bbb' 
); 

function rsplit(&$v, $w) 
{ 
    list($first, $tail) = explode('/', $w, 2); 
    if(empty($tail)) 
    { 
     $v[] = $first; 
     return $v; 
    } 
    $v[$first] = rsplit($v[$first], $tail); 
    return $v; 

} 

$result = array_reduce($src, "rsplit"); 
print_r($result); 

sortie est:

Array (
    [invoice] => Array 
     (
      [products] => Array 
       (
        [data] => Array 
         (
          [0] => item1 
          [1] => item2 
          [2] => item2 
         ) 

       ) 

     ) 

    [foo] => Array 
     (
      [bar] => Array 
       (
        [0] => baz 
       ) 

     ) 

    [aaa] => Array 
     (
      [0] => bbb 
     ) 

) 
+0

Ceci est une belle solution fonctionnelle et mérite bien plus de mises à jour que ce qu'il a actuellement. – erisco

+0

je suis d'accord, génial – ronaktal