我有一个非常复杂的数组操作,或者至少对我来说很复杂。可以说我有这样的阵列
$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;
}
}
}
我发誓我试过如何证明我不知道更好。请不要折磨。如果你有任何想法只是分享,我要求的太多了吗?
答案 0 :(得分:2)
我无法解释这一点,所以我只想使用代码:
$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;
}
}
基本上与原来相同,但尺寸较小。这就是您提供的数据所需的全部内容。