2011-12-12 72 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