复杂的数组操作


Complicated array operation

我有一个相当复杂的数组操作,至少对我来说是复杂的。比如我有这样一个数组

$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;
  }
}

基本上和你原来的方式一样,但是维度更少了。这就是您所提供的数据所需要的全部内容。