如何以不寻常的方式对数组进行排序

时间:2014-01-18 06:45:43

标签: php

我今天接受了采访,并被问到这个PHP问题。

如何编写程序来对此数组进行排序

FROM:

$my_arr = array(2, 45, 15, 75, 12, 99);

TO:

$my_new_arr = array(2, 99, 12, 75, 15, 45);  // (smallest, largest, second smallest, second largest, third smallest, third largest)

在下一位面试官进来之前,经理只给了我12分钟的工作时间。我被困了(仍然是)所以我做不到。

4 个答案:

答案 0 :(得分:4)

函数array_shiftarray_pop对您的目的非常有用:

$my_arr = array(2, 45, 15, 75, 12, 99);
sort($my_arr, SORT_NUMERIC);
$my_new_arr = array();
$func = "array_shift";
while(sizeof($my_arr)){
    // as long as there are elements in the array
$my_new_arr[] = $func($my_arr);
    // apply either “array_shift” or “array_pop” to the array
$func = ($func == "array_shift") ? "array_pop" : "array_shift";
    // change “array_shift” to “array_pop” and “array_pop” to “array_shift” for the next iteration
}
print_r($my_new_arr);

输出将是:

Array
(
    [0] => 2
    [1] => 99
    [2] => 12
    [3] => 75
    [4] => 15
    [5] => 45
)

答案 1 :(得分:3)

根据 @Barmar 的评论:

  

对数组进行排序。然后取第一个元素,最后一个元素,第二个元素,倒数第二个元素,依此类推,直到到达中间位置。

您可以借助sort()array_pop()array_shift()来实现此类内容:

$array = array(2, 45, 15, 75, 12, 99);

sort($array);

$result = array();

while($array){
    $result[] = array_shift($array);

    if(!$array)break;

    $result[] = array_pop($array);
}

print_r($result);

节目:

Array
(
    [0] => 2
    [1] => 99
    [2] => 12
    [3] => 75
    [4] => 15
    [5] => 45
)

答案 2 :(得分:0)

评论中的人可能会给你一个艰难的时间(特别是没有展示你的尝试),但面试官可能正在寻找这样的东西:

$my_arr = array(2, 45, 15, 75, 12, 99);
sort($my_arr); //order it from smallest to largest
$new_array = array();
while(count($my_arr)>0){ //while there are any items in the array
    $new_array[] = array_shift($my_arr); //get the first item and remove it
    if (count($my_arr) > 0){ //if there is a last element, get that and remove it
        $new_array[] = array_pop($my_arr);  
    }
}
print_r($new_array);

或者,你可以在没有array_shift/pop函数的情况下接近它,以防这些特定的PHP函数不是你知道的东西:

$my_arr = array(2, 45, 15, 75, 12, 99);
sort($my_arr); //order it from smallest to largest

$new_array = array();
$total_elements = count($my_arr);
for($i=0;$i<$total_elements;$i++){
    if (!isset($my_arr[$i])){break;} //there's nothing left to do
    $new_array[] =  $my_arr[$i];
    if (isset($my_arr[$total_elements-$i])){
        $new_array[] =  $my_arr[$total_elements-$i];
        unset($my_arr[$total_elements-$i]); //remove the tail one
    }
}
print_r($new_array);

答案 3 :(得分:0)

最简单的是:

使用$my_arr = array(2, 45, 15, 75, 12, 99)

对此数组sort($my_arr);进行排序

并生成名为$sorted = array()

的新数组
for($i = 0; $i < $size / 2; $i++) {
    $sorted[] = $my_arr[$i]; // Smallest....to..Largest

    if(count($sorted) === $size) break; // Stop if array is already sorted
    $sorted[] = $my_arr[$size - $i - 1]; // and largest to smallest.
}

这样我们可以保持原始数组的原样。并且可以获得更新的zigzag排序数组。