2012-01-24 11 views
-1

から動的配列を生成し、私はこのようにフォーマットされている文字列の配列を持っている:爆発した文字列

$strings = array(
    "/user", 
    "/robot", 
    "/user/1", 
    "/user/2", 
    "/user/2/test", 
    "/robot/1" 
); 

私はそれをprint_r()とき、私は次のような構造の配列にこれを回している実行する必要があります。

Array 
(
    [user] => Array (
    [1] => array(), 
    [2] => Array (
     [test] => array() 
    ) 
    [robot] => Array (
     [1] => array() 
    ) 
) 

デリミタ/で元の文字列を爆発させる必要があることは知っています。しかし、私の問題は、どのように動的配列を構築するかということです。

文字列には、無制限のスラッシュが含まれる可能性があります。

+0

幸運を再帰的に考えて...各ループでは、我々は不足しているキーを作成し、その新しい配列を取り、参照を使用して、新しい$パスとして保存し、その後(配列に初期化)し、 。たとえば、オリジナルの各要素を一度爆発させ、展開された配列を関数に渡して、展開された配列の最後の要素に到達するまでツリーをナビゲートして、要素を挿入することができます。 – Tim

+2

FYI、私はこれが["gimme teh codez"](http://meta.stackexchange.com/q/108551/164291)の質問であるため、これが下降表示されたと推測しています。 –

答えて

2

リストをトラバースする際に参照を使用して、アレイを徐々に構築することができます。

$strings = array(
    "/user", 
    "/robot", 
    "/user/1", 
    "/user/2", 
    "/user/2/test", 
    "/robot/1" 
); 

$extracted = array(); 

foreach($strings as $string) 
{ 
    $pos =& $extracted; 
    foreach(explode('/', ltrim($string, '/')) as $split) 
    { 
    if(! isset($pos[$split])) 
    { 
     $pos[$split] = array(); 
    } 

    $pos =& $pos[$split]; 
    } 
} 

print_r($extracted); 

このコードは非常によく、空の要素を処理しない場合があります(例えば、)、あなたの要件に応じて。

+0

ニースは正確に同じ時刻に投稿され、解決方法はまったく同じです... cheers phoenix –

+0

@MathieuDumoulin Yoursは良い説明をしています。そして、2つのアプローチの違いは2つあります。この小さな運動から何かを学ぶ機会。あなたも私から+1を得る(: –

1

次のコードは、あなたが非常に近くを探したり何を与える必要があります...

$result = array(); 
foreach($strings as $string){ 

    $exploded = explode('/', substr($string, 1)); 
    $path = &$result; 

    foreach($exploded as $explodedpart){ 
     if(!array_key_exists($explodedpart, $path)){ 
      $path[$explodedpart] = array(); 
     } 
     $path = &$path[$explodedpart]; 
    } 
} 

は、配列を初期化して、ループのすべての文字列をして/(最初のものを除い)でそれらを爆発しました。次に、結果配列の最初のレベルへの初期参照を設定します。 &に注目してください。このアルゴリズムでは続けることが重要です。

次に、分解した文字列の各部分をループして、その部分が、現在の$パス内のキーとして存在し、現在の結果の現在のステップにリンクされているかどうかをチェックします。残り

関連する問題