2013-02-10 67 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); 
?>