我知道http_build_query()和parse_str()是解决此类问题的更好方法,但我无法更改我正在处理的特定项目中的数据结构,所以我正在尝试通过从数据库存储的字符串创建大型3d关联数组来简化一些事情。
有人可以帮我递一下这个函数的递归吗?我想要它采取这样的事情:
explode3D( $separators = array('|',','),
$string = "val1,val2|val1,val2,val3",
$keys = "cat1,item1,item2|cat2,item1,item2,item3"
);
并返回类似这样的内容
Array (
'cat1' => Array('item1'=>'val1', 'item2'=>'val2'),
'cat2' => Array('item1'=>'val1', 'item2'=>'val2', 'item3'=>'val3')
)
这是迄今为止的功能:
function explode3D($separators,$string,$keys=0){
$res = array();
if(is_array($separators)){//MULTI DIMENSION MODE: (unfinished!!)
//help needed here//
}else{//SINGLE DIMENSION MODE:
$vals = explode($separators,$string);
if($keys === 0){ //NO KEYS:
$res = $vals;
}else if($keys === 1){//ALTERNATE ROWS ARE KEYS:
$key = '';
for($i=0; $i<sizeof($vals); $i++){
if ($i++ % 2 == 1 ){ //every second element:
$key = $vals[$i]; //save the key
}else{
$res[$key] = $vals[$i]; //set the saved key = value
}
}
}else{ //GET KEYS FROM $keys ARRAY:
if(is_string($keys)){ //explode keys string if necessary (using $separators)
$keys = explode3D($separators,$keys);
}
for($i=0; $i<sizeof($vals); $i++){
$res[$keys[$i]] = $vals[$i];
}
}
}
return($res);
}
答案 0 :(得分:0)
以下是它应该如何工作的想法。我相信很少有错别字和错过的操作符,但它有助于你理解操作方法。
<?php
$string = "val1,val2|val1,val2,val3";
$keys = "cat1,item1,item2|cat2,item1,item2,item3";
$firstDimension = explode("|", $keys);
$firstDimensionValues = explode("|", $string);
$newArray = Array();
for($i = 0; $i < count($firstDimension); $i++)
{
$d2Keys = explode(",", $firstDimension[$i]);
$key = $d2Keys[0];
array_shift($d2Keys); // remove $key
$d2Values = explode(",", $firstDimensionValues[$i]);
for ($a = 0; $a < count($d2Keys); $a++)
{
$newArray[$key][$d2Keys[$a]] = $d2Values[$a];
}
}
print_r($newArray);