复杂的阵列操作

时间:2011-12-12 20:28:30

标签: php arrays

我有一个非常复杂的数组操作,或者至少对我来说很复杂。可以说我有这样的阵列

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

} 

我发誓我试过如何证明我不知道更好。请不要折磨。如果你有任何想法只是分享,我要求的太多了吗?

1 个答案:

答案 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;
  }
}

基本上与原来相同,但尺寸较小。这就是您提供的数据所需的全部内容。