2011-04-12 56 views
2

在PHP中,我需要把這個數組:PHP字符串數組結構

array(
    'group1_selector1_rule1' => value 
, 'group1_selector1_rule2' => value 
, 'group1_selector1_rule3' => value 
, 'group1_selector2_rule1' => value 
, 'group1_selector2_rule2' => value 
, 'group2_selector1_rule1' => value 
, 'group2_selector1_rule2' => value 
, 'group3_selector1_rule1' => value 
, 'group3_selector2_rule1' => value 
, 'group3_selector2_rule2' => value 
); 

到這一點:

array(
    'group1' => array(

     'selector1' => array(
      'rule1' => value 
     , 'rule2' => value 
     , 'rule3' => value 
     ) 

    , 'selector2' => array(
      'rule1' => value 
     , 'rule2' => value 
     ) 

    ) // end group 1 

, 'group2' => array(

     'selector1' => array(
      'rule1' => value 
     , 'rule2' => value 
     ) 
    ) // end group 2 

, 'group3' => array(

     'selector1' => array(
      'rule1' => value 
     ) 

    , 'selector2' => array(
      'rule1' => value 
     , 'rule2' => value 
     ) 
    ) // end group 3 
); // end array 

如果有任何人想提出一個聰明的辦法,我想有興趣:) 我想我可以用一些算法,但我想要一些優雅的東西,並有一種巧妙的使用explode()和一些'array_merging'函數可以做到這一點的感覺?

回答

4
$res_array = array(); 
    foreach ($array as $key=>$value) { 
    $x = explode("_", $key); 
    $res_array[$x[0]][$x[1]][$x[2]] = $value; 
    } 

    var_dump($res_array); 

爲$陣列

$array = array(
    'group1_selector1_rule1' => 'value1' 
, 'group1_selector1_rule2' => 'value2' 
, 'group1_selector1_rule3' => 'value3' 
, 'group1_selector2_rule1' => 'value4' 
, 'group1_selector2_rule2' => 'value5' 
, 'group2_selector1_rule1' => 'value6' 
, 'group2_selector1_rule2' => 'value7' 
, 'group3_selector1_rule1' => 'value8' 
, 'group3_selector2_rule1' => 'value9' 
, 'group3_selector2_rule2' => 'value10' 
); 

輸出:

array(3) { 
    ["group1"]=> 
    array(2) { 
    ["selector1"]=> 
    array(3) { 
     ["rule1"]=> 
     string(6) "value1" 
     ["rule2"]=> 
     string(6) "value2" 
     ["rule3"]=> 
     string(6) "value3" 
    } 
    ["selector2"]=> 
    array(2) { 
     ["rule1"]=> 
     string(6) "value4" 
     ["rule2"]=> 
     string(6) "value5" 
    } 
    } 
    ["group2"]=> 
    array(1) { 
    ["selector1"]=> 
    array(2) { 
     ["rule1"]=> 
     string(6) "value6" 
     ["rule2"]=> 
     string(6) "value7" 
    } 
    } 
    ["group3"]=> 
    array(2) { 
    ["selector1"]=> 
    array(1) { 
     ["rule1"]=> 
     string(6) "value8" 
    } 
    ["selector2"]=> 
    array(2) { 
     ["rule1"]=> 
     string(6) "value9" 
     ["rule2"]=> 
     string(7) "value10" 
    } 
    } 
} 
+0

很快:)非常感謝,救了我半夜在這裏! – mikkelbreum 2011-04-12 21:50:08

+0

@mikkelbreum - 不客氣的朋友:) – Wh1T3h4Ck5 2011-04-12 21:50:57

2
<? 

$poo=array(
    'group1_selector1_rule1' => 'value' 
, 'group1_selector1_rule2' => 'value' 
, 'group1_selector1_rule3' => 'value' 
, 'group1_selector2_rule1' => 'value' 
, 'group1_selector2_rule2' => 'value' 
, 'group2_selector1_rule1' => 'value' 
, 'group2_selector1_rule2' => 'value' 
, 'group3_selector1_rule1' => 'value' 
, 'group3_selector2_rule1' => 'value' 
, 'group3_selector2_rule2' => 'value' 
); 

foreach ($poo as $k=>$v){ 
     list($a,$b,$c) = explode('_',$k); 
     $new[$a][$b][$c]=$v; 
} 
print_r($new); 

http://www.ideone.com/skv0a

+0

謝謝,你給我看的很棒的工具http://www.ideone.com/我喜歡它可以顯示內存使用情況和執行時間,可以比較解決方案。對不起,我不能接受這兩個答案。這個從語法上來看似乎稍微優雅一些​​,但我想他們的做法大致相同。 – mikkelbreum 2011-04-12 21:52:19

2

如何通用SOLUT離子?

<?php 
function transform($oldArray) 
{ 
    $newArray = array(); 
    foreach ($oldArray as $selector => $value) 
    { 
    $parts = explode('_', $selector); 
    $last = array_pop($parts); 
    $arr = &$newArray; 

    foreach ($parts as $part) 
    { 
     if (!is_array($arr[$part])) $arr[$part] = array(); 
     $arr = &$arr[$part]; 
    } 
    $arr[$last] = $value; 
    } 
    return $newArray; 
} 
?> 
+0

謝謝,關於泛型與特定解決方案的好點。 – mikkelbreum 2011-04-12 21:53:57