2012-10-15 26 views
0

這是我的數組:如何對數組進行這樣的排序?

$foo1 = array (5) { 
      [0] => 'foo1', 
      [1] => 'foo2', 
      [2] => 'foo3', 
      [3] => 'foo4', 
      [4] => 'foo5' 
     } 

$foo2 = array (5) { 
      [0] => 200, 
      [1] => 130, 
      [2] => 110, 
      [3] => 80, 
      [4] => 20 
     } 

$foo3 = array (5) { 
      [0] => 610, 
      [1] => 630, 
      [2] => 500, 
      [3] => 800, 
      [4] => 200 
     } 

這只是意味着它是什麼樣子,而不是我的實際PHP代碼。

現在,我想要做的是這個 - 我想排列數組$foo1總數的排列$foo2$foo3。但這與我最後一個問題不一樣,因爲這次如果數組$foo2中的值小於100或者數組$foo3中的值小於600,我不希望它靠近頂端。我希望它放在所有最後的數組中,其數組$foo2中的值爲100以上,並且數組$foo3中的值爲600以上。所以在下面的數組中,結果將是:

$foo1 = array (5) { 
      [0] => 'foo1', 
      [1] => 'foo2', 
      [2] => 'foo4', 
      [3] => 'foo3', 
      [4] => 'foo5' 
     } 

如果您以上未完全瞭解,這就是原因。因爲數組0123'中與foo1具有相同關鍵字的數組中的數值$foo2中的值大於100,並且具有與數組$foo1中的foo1相同的關鍵字的數組中的值高於600,並且它具有最高總和。下一個是foo2,因爲它是具有滿足要求的相同索引關鍵字並且具有最高總和的下一個元素。其次是foo4,因爲沒有其他行滿足要求,其他數組中的等效鍵具有不滿足要求的行中的最大總和。出於同樣的原因,foo3foo5分別是第4和第5。

希望我不是太具體,有什麼幫助嗎?

+0

是否需要保留foo1的關鍵值?或者你只需​​要按照排序順序的值? –

回答

3

先將它們合併,添加一個標記("tail"=>true/false)並對其進行排序。

function special_sort($arr1,$arr2,$arr3) 
{ 
    $arr=array(); 
    foreach($arr1 as $key=>$val) 
    { 
     $arr[$key]=array("val"=>$val,"sum"=>($arr2[$key]+$arr3[$key]),"tail"=>(($arr2[$key]<100 || $arr3[$key]<600)?true:false)); 
    } 
    usort($arr,function($a,$b){ 
     if($a["tail"] && !$b["tail"]) 
      return 1; 
     elseif(!$a["tail"] && $b["tail"]) 
      return -1; 
     elseif($a["sum"]>$b["sum"]) 
      return -1; 
     elseif($a["sum"]<$b["sum"]) 
      return 1; 
     else 
      return 0; 
    }); 
    return $arr; 
} 

測試結果:

$foo1=array("foo1","foo2","foo3","foo4","foo5"); 
$foo2=array(200,130,110,80,20); 
$foo3=array(610,630,500,800,200); 
print_r(special_sort($foo1,$foo2,$foo3)); 

輸出

Array 
(
    [0] => Array 
     (
      [val] => foo1 
      [sum] => 810 
      [tail] => 
     ) 

    [1] => Array 
     (
      [val] => foo2 
      [sum] => 760 
      [tail] => 
     ) 

    [2] => Array 
     (
      [val] => foo4 
      [sum] => 880 
      [tail] => 1 
     ) 

    [3] => Array 
     (
      [val] => foo3 
      [sum] => 610 
      [tail] => 1 
     ) 

    [4] => Array 
     (
      [val] => foo5 
      [sum] => 220 
      [tail] => 1 
     ) 

) 

你必須,如果你想取出 「VAL」 值。這應該不難。

+0

對不起,提出這樣一個單調乏味,羅嗦的問題。真棒回答都一樣。 – think123

+0

另外,我將如何根據第一個排序方式對另外兩個數組進行排序,並以某種方式返回它們? – think123

+0

@ think123在這種情況下,我寧願將所有三個值都保存到'special_sort()'(現在只保存'$ foo1'中的值)的'$ arr'中,然後在排序後將它們排除。 – Passerby

0

您可能想看看usort(),這也會使您的代碼比其他示例更容易閱讀。