2013-02-10 54 views
0

我有以下類型的數組的:PHP特定的排序號

$foo = array(
     "a" => 1, 
     "b" => 1, 
     "c" => 2, 
     "d" => 2, 
     "e" => 3, 
     "f" => 3, 
     "g" => 4, 
     "h" => 4, 
     "i" => 5, 
     "j" => 5, 
     "k" => 10, 
     "l" => 12, 
     "m" => 15, 
     "n" => 20 
     ); 

我需要用這種方式對數組進行排序:以

$foo = array(1,2,3,4,5,12,20,15,10,5,4,3,2,1); 

正如你所看到的,最有價值的需要在陣列的中間。數組的開始/結束處的最小值。關鍵需要鏈接到原始值。

感謝您的幫助!對不起我的英語不好。

+2

你需要保持數組鍵? – 2013-02-10 18:42:49

+0

你爲什麼需要它? – SparKot 2013-02-10 18:47:23

+0

@Dagon是的,我需要保持數組鍵 – DrSAS 2013-02-10 18:48:58

回答

4

如果輸入已經被排序,你可以用兩個循環,首先推動每個項目升序排列奇數偏移量,然後以降序排列到您的陣列甚至抵消每一個項目:

$keys = array_keys($foo); 
$n = count($keys); 
$result = array(); 
for ($i=0; $i<$n; $i+=2) { 
    $result[$keys[$i]] = $foo[$keys[$i]]; 
} 
for ($i=$n-$n%2-1; $i>0; $i-=2) { 
    $result[$keys[$i]] = $foo[$keys[$i]]; 
} 
+0

哇它的工作!感謝你們所有人! – DrSAS 2013-02-10 20:30:17

1

首先按升序排列所有整數。 可以說$ foo_as是你按升序得到的新數組。

$a=a new empty array of size $n 

$n=number of integers. 
$c=0; 
for ($i=$n-1;$i>0;$i--){ 
    if (i%2==0){ 
     $a(i/2)+c=$foo_as($n-$c) 
    } 
    else{ 
     $a(i+1/2)-c=$foo_as($n-$c) 
    } 
    $c++ 
} 

說明:我把最大的整數放在中間。之後,我用整數按降序填充中間的索引。

- - - - - 11 - - - - - 
- - - - 10 11 - - - - - 
- - - - 10 11 9 - - - - 
- - - 8 10 11 9 - - - - 
- - - 8 10 11 9 7 - - - 
- - 6 8 10 11 9 7 - - - 
- - 6 8 10 11 9 7 5 - - 
- 4 6 8 10 11 9 7 5 - - 
- 4 6 8 10 11 9 7 5 3 - 
2 4 6 8 10 11 9 7 5 3 - 
2 4 6 8 10 11 9 7 5 3 1 

我已經使用了一個基本的算法來演示這一點。如果在某個時候,我的php語法不正確,請忽略它。

+0

+1爲漂亮的圖 – 2013-02-10 19:11:49

+0

@Dagon:我認爲這是代碼。不管怎麼說,多謝拉。 '+ 1s'是'+ 1s' .. :) – xan 2013-02-10 19:17:31

0

一個矯枉過正的版本:

<?php 
$foo = array(
     "a" => 1, 
     "b" => 1, 
     "c" => 2, 
     "d" => 2, 
     "e" => 3, 
     "f" => 3, 
     "g" => 4, 
     "h" => 4, 
     "i" => 5, 
     "j" => 5, 
     "k" => 10, 
     "l" => 12, 
     "m" => 15, 
     "n" => 20 
); 

$arrayKeys = array_keys($foo); 
$arrayValues = array_values($foo); 

$array_count = count($foo); 
for ($idx =0; $idx < round($array_count/2); $idx+=2) { 
    $tmpA = $arrayKeys[$idx]; 
    $arrayKeys[$idx] = $arrayKeys[$array_count - $idx -1]; 
    $arrayKeys[$array_count - $idx -1] = $tmpA; 

    $tmpB = $arrayValues[$idx]; 
    $arrayValues[$idx] = $arrayValues[$array_count - $idx -1]; 
    $arrayValues[$array_count - $idx -1] = $tmpB; 
} 

$tmpArray = array_combine($arrayKeys, $arrayValues); 

$ascent = array_slice($tmpArray, 0, round($array_count/2)); 
$descent = array_slice($tmpArray, round($array_count/2)); 

asort($ascent); 
arsort($descent); 

$foobar = array_merge($ascent, $descent); 

var_dump($foo, $foobar); 
?>