2011-12-12 73 views
-1

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

$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,该创建dynamicall。我尝试了很多方法,但我失败了很多次。希望有人有一个简短的,简单的逻辑来解决这个问题。

谢谢。 编辑:这是我最短的尝试。我有很多不同的方法,但是这个代码是大代码结构的一部分,你在这里看到的例子是为了简化我需要的逻辑而创建的。

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

} 

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

+5

那么,你尝试了什么? –

+0

这不是真正的数组应该如何工作。如果有4个URL,会发生什么情况,你会如何检查这个? – Flukey

+0

许多不同类型的foreach循环,数组函数,但我不想把它们放在这里,因为它们是错误的。如果需要,我可以发布一些,但我不认为他们会有所帮助。 – ufucuk

回答

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

基本上你有它最初以同样的方式,而是用更少的尺寸。这就是您提供的所有数据。

+0

你甚至试过这段代码来看结果吗?那么我为你做了,首先它是越野车,其次它修复错误时不起作用。 – ufucuk

+0

不是直接的,但我做了很多次类似的操作。这基本上是我使用的代码。这将有助于了解它有什么问题。 – Jon

+0

使用结果数组的方法只接受这种类型的结构。如果我能控制它,我真的会创造出更好的设计。 – ufucuk