我有一个相当复杂的数组操作,至少对我来说是复杂的。比如我有这样一个数组
$myArr['url_1']['linktypes']['follow'] = 10;
$myArr['url_1']['linktypes']['nofollow'] = 20;
$myArr['url_1']['linktypes']['other'] = 30;
$myArr['url_2']['linktypes']['follow'] = 40;
$myArr['url_2']['linktypes']['nofollow'] = 50;
$myArr['url_2']['linktypes']['other'] = 60;
$myArr['url_3']['linktypes']['follow'] = 70;
$myArr['url_3']['linktypes']['nofollow'] = 80;
$myArr['url_3']['linktypes']['other'] = 90;
和简单的(!)我需要得到以下结果
array(
array("id"=>1,"metric"=>'follow','url_1'=>10,'url_2'=>40,'url_3'=>70),
array("id"=>2,"metric"=>'nofollow','url_1'=>20,'url_2'=>50,'url_3'=>80),
array("id"=>3,"metric"=>'other','url_1'=>30,'url_2'=>60,'url_3'=>90)
);
这些数组元素是从$myArr中动态创建的。我尝试了很多方法,但我失败了很多次。希望有人有一个简短的逻辑来解决这个问题。
谢谢。编辑:这是我最短的一次尝试。我有很多不同的方法,但这段代码是大代码结构的一部分,你在这里看到的例子是为了简化我需要的逻辑而创建的。
$linkStructure = array();
foreach($myArr as $links=>$value){
$counter = 0;
foreach($value['linktypes'] as $ltKey => $ltValue){
if($linkStructure[$counter]["id"] && $linkStructure[$counter]["metric"] == $ltKey){
$linkStructure[$counter][$links] = $ltValue;
}
else{
$linkStructure[$counter]["id"] = $counter;
$linkStructure[$counter]["metric"] = $ltKey;
$linkStructure[$counter][$links] = $ltValue;
}
}
}
我发誓我已经尽力证明了,我不知道。请不要折磨我。如果你有什么想法就告诉我,我的要求是不是太过分了?
我不能很好地解释这个,所以我将使用代码:
$fixedArr = array();
$idCount = 1;
foreach($myArr as $title=>$subArr)
foreach($subArr['linktypes'] as $metric=>$val) {
if(!array_key_exists($metric)) {
$fixedArr[$metric] = array();
$fixedArr[$metric]['id'] = $idCount;
$fixedArr[$metric]['metric'] = $metric;
$idCount += 1;
}
$fixedArr[$metric][$title] = $val;
}
应该可以了。
但是我应该说注释是对的,一个更好的方式来组织你的数组应该是这样的:
Array {
[url_*] => Array {
[metric] => someValue;
}
}
基本上和你原来的方式一样,但是维度更少了。这就是您所提供的数据所需要的全部内容。