我今天接受了采访,并被问到这个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分钟的工作时间。我被困了(仍然是)所以我做不到。
答案 0 :(得分:4)
函数array_shift和array_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排序数组。