In php, I need to turn this array:
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
);
into this:
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
If anyone out there would like to suggest a smart way, I'd be interested :) I think I could labour some algorithm, but I'd like something elegant and have a feeling that some clever use of explode() and some 'array_merging' functions could do it?
asked Apr 12, 2011 at 21:26
mikkelbreum
3,08110 gold badges39 silver badges41 bronze badges
3 Answers 3
$res_array = array();
foreach ($array as $key=>$value) {
$x = explode("_", $key);
$res_array[$x[0]][$x[1]][$x[2]] = $value;
}
var_dump($res_array);
for $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'
);
Output:
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"
}
}
}
answered Apr 12, 2011 at 21:31
Wh1T3h4Ck5
8,52910 gold badges63 silver badges82 bronze badges
Sign up to request clarification or add additional context in comments.
1 Comment
mikkelbreum
that was fast :) thanks a lot, saved me half an evening here!
<?
$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);
answered Apr 12, 2011 at 21:34
profitphp
8,4022 gold badges30 silver badges21 bronze badges
1 Comment
mikkelbreum
thanks, and great tool you showed me ideone.com I like that it shows memory usage and execution time, makes it possible to compare solutions. sorry I can't accept both answers. this one seems slightly more elegant from the syntax, but I guess they do roughly the same.
How about a generic solution?
<?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;
}
?>
answered Apr 12, 2011 at 21:47
Lior Cohen
9,0652 gold badges31 silver badges27 bronze badges
1 Comment
mikkelbreum
thanks, good point regarding the generic vs. specific solutions.
lang-php