2011-11-26 25 views
4

をあるarray_walk私は、階層的な事前に定義された用語PHPは多次元配列

array("fruits", "yellow", "pineapple"); 
array("fruits", "yellow", "lemon"); 
array("fruits", "red", "apple"); 

のいくつかの種類を3つの配列を持って、私はhierachyのようなものを持っている連想配列があります。

array('fruits'=>array('red'=>array('tomato'))); 

どのようにプッシュすることができますが私の得意な3つの配列の条件:

array('fruits'=>array('yellow'=>array('pineapple','lemon'),'red'=>array('tomato','apple'))); 

私はarray_walkを使用しますか?またはarray_walk_recursive? どうすればよいですか?

ベスト、イェルク

答えて

3

各果物をネストされた配列に変換してから、array_merge_recursive()を使用してマージします。ここでは実施例(also on Codepad

$fruits = array(
    array("fruits", "yellow", "pineapple"), 
    array("fruits", "yellow", "lemon"), 
    array("fruits", "red", "apple"), 
    array("fruits", "red", "tomato"), 
); 

// Convert array to nested array 
function nest($leaf) 
{ 
    if (count($leaf) > 1) 
    { 
    $key = array_shift($leaf); 

    return array($key => nest($leaf)); 
    } 
    else 
    { 
    return $leaf; 
    } 
} 

$tree = array(); 

foreach($fruits as $fruit) 
{ 
    // Convert each fruit to a nested array and merge recursively 
    $tree = array_merge_recursive($tree, nest($fruit)); 
} 

print_r($tree); 
+0

ありがとう!それでおしまい!あなたは私の一日を過ごしました:-) – user987875

1
$fruits[] = array("fruits", "yellow", "pineapple"); 
$fruits[] = array("fruits", "yellow", "lemon"); 
$fruits[] = array("fruits", "red", "apple"); 

foreach($fruits as $fruit) { 
    $multifruit[$fruit[0]][$fruit[1]][] = $fruit[2]; 
} 

print_r($multifruit); 

/* yields: 
Array 
(
    [fruits] => Array 
     (
      [yellow] => Array 
       (
        [0] => pineapple 
        [1] => lemon 
       ) 

      [red] => Array 
       (
        [0] => apple 
       ) 

     ) 

) 
*/ 

は正確に何をしたい行います。割り当ての左側の最後の[]は、存在する場合は既存の値を上書きするのではなく、右側を追加します。

+0

この答えの私の唯一の問題は、長いまたは短い配列を処理するためには一般的ではないということです。配列(「フルーツ」、「黄色」、「リンゴ」、「おばあちゃん」)を食べればどうでしょうか? –

0
<?php 

$fruits[] = array("fruits", "yellow", "pineapple"); 
$fruits[] = array("fruits", "yellow", "lemon"); 
$fruits[] = array("fruits", "red", "apple"); 
$fruits[] = array("fruits", "blue", "small","blueberry"); 
$fruits[] = array("fruits", "blue", "bluefruit"); 
$fruits[] = array("fruits", "multicolor-fruit"); 

function deeper(&$multifruit, $fruit) { 
    if (count($fruit)>2) { 
     $shifted = array_shift($fruit); 
     deeper($multifruit[$shifted], $fruit); 
     return $multifruit; 
    } else { 
     return $multifruit[$fruit[0]][] = $fruit[1]; 
    } 
} 

foreach($fruits as $fruit) { 
    deeper($multifruit, $fruit); 
} 

print_r($multifruit); 
?> 

ここでは、あなたの問題のより一般的な解決策で行きます。私はしばらくかかったので、あなたはそれを感謝します:)