【PHP】调整数组顺序使奇数位于偶数前(闭包扩展)

这道题意思就是,给所有奇数放到偶数前面,我们可以设置两个指针,一个从前往后,直到他扫到偶数,一个从后往前,直到他扫到奇数,然后交换两个数的位置,然后往下扫,当begin>end的时候停止。代码实现很简单,如下:

<?php //调整数组,使奇数位于偶数前面 function reorder($arr){ $length = count($arr); $begin = 0; $end = $length - 1; while($begin < $end){ //向后移动begin,直到它指到偶数 while(($begin < $end) && (($arr[$end] & 0x1) != 0)){ $begin++; } //向前移动end,指到它指到奇数 while(($begin < $end) && (($arr[$end] & 0x1) == 0)){ $end--; } if($begin < $end){ $temp = $arr[$begin]; $arr[$begin] = $arr[$end]; $arr[$end] = $temp; } } return $arr; } $arr = [1,2,3,4,5,6,7,8]; var_dump(reorder($arr));

上面需要注意的时,判断一个数是奇数还是偶数的时候,我用的$num & 0x1 如果等于1,则为奇数,等于0,则为偶数,效率比%要高一些。

到这里,如果单纯对于这道题,已经算是完事了。

但是如果题目一改,将所有偶数放于奇数前,你可能又要重写一个函数了。

这时,需求又改了,将所有能被3整除的放到前面………

所有负数放到前面…….

写完以上那么多函数,发现这些函数都类似啊,只有判断条件不一样。

我们可不可以将整个函数,解耦成两部分,一个是判断数字应该在函数的前半部分还是后半部分,一个是交换数组位置。

这时候我们就用到了闭包,代码如下

<?php //调整数组,使奇数位于偶数前面 function reorder($arr, $func){ $length = count($arr); $begin = 0; $end = $length - 1; while($begin < $end){ //向后移动begin,直到它指到偶数 while(($begin < $end) && (!$func($arr[$begin]))){ $begin++; } //向前移动end,指到它指到奇数 while(($begin < $end) && ($func($arr[$end]))){ $end--; } if($begin < $end){ $temp = $arr[$begin]; $arr[$begin] = $arr[$end]; $arr[$end] = $temp; } } return $arr; } $func = function($condition){ $flag = ($condition & 0x1) == 0; return $flag; }; $arr = [1,2,3,4,5,6,7,8]; var_dump(reorder($arr, $func));
点赞