2011-04-12 57 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