用usort()进行简单排序 $b) { return 1; } else if ($a < $b) { return -1; } else if ($a == $b) { return 0; }}//让usort使用cmp回调函数对数组$a进行升序排序usort($a, 'cmp'); foreach ($a as $key => $value) { echo '$key => $value\n';}?>排序结果为 0 => 51 => 92 => 173 => 624 => 83
使用usort对多维数组进行排序print_r的显示结果为Array ( [0] => Array ( [city] => beijing ) [1] => Array ( [city] => chongqing ) [2] => Array ( [city] => shanghai ) [3] => Array ( [city] => tianjin ) ) ,可知4个城市名称已经按字母的升序进行了排序, 即 $cities[0]['city'] => beijing$cities[0]['city'] => chongqing$cities[0]['city'] => shanghai$cities[0]['city'] => tianjin
把类的静态方法或者对象的方法当成一个回调函数传递给usort()$b) { return 1; } else if ($a<$b) { return -1; } else { return 0; }}//定义一个用于比较的非静态方法cmp_method2, 其用于降序排序function cmp_method2 ($a, $b) { if ($a>$b) { return -1; } else if ($a<$b) { return 1; } else { return 0; } }}//把一个类的静态方法传递给usort()需要使用数组形式,//数组的第一个元素是类的名字,第二个参数是静态方法的名字usort($arr, array('obj', 'cmp_method'));print_r($arr);其输出结果为Array ( [0] => x [1] => y [2] => z ), 即把数组$arr进行了升序排序//把类obj实例化为对象$obj$obj = new obj();//把对象的非静态方法传递给usort()参数也需要使用数组形式,//数组的第一个元素是对象变量$obj, 第二个参数是非静态方法的名字usort($arr, array($obj, 'cmp_method2'));print_r($arr);其输出结果为Array( [0] => z [1] => y [2] => x), 即把数组$arr进行了降序排序
使用一个闭包(closure)去排序多维数组 '1', 'city' => 'Shanghai');$array[1] = array('gdp' => '2', 'city' => 'Beijing');$array[2] = array('gdp' => '3', 'city' => 'Guangzhou');function sorter($key) { //匿名函数使用use引用外部函数sorter的参数从而形成闭包 return function ($a, $b) use ($key) { //按照字母自然顺序排序, 字母升序 return strnatcmp($a[$key], $b[$key]); };}//当usort()第二个参数调用了build_sorter函数后,//build_sorter()函数返回其内部的匿名函数,//该匿名函数还引用了build_sorter()传入的参数$keyusort($array, sorter('city')); //这是以第二维的第二个元素为排序标准foreach ($array as $item) {echo $item['city'], '的GPD排名是第', $item['gdp'], '
';}?>输出结果为, 按照城市字母的升序进行了排序Beijing的GPD排名是第2Guangzhou的GPD排名是第3Shanghai的GPD排名是第1END
PHP7新增了一个宇宙飞船操作符(spaceship operator), 它可以简化回调函数的返回部分,从而简化usort()函数的书写过程 比较两个数的大小时写做 $a <=> $b , 该运算时有三种结果, 当左边大于右边返回1, 左边小于右边返回-1, 两边相等返回0, 如果需要降序结果, 直接在前面加上负号, 取反即可, 如 -($a<=>$b), 如下代码是宇宙飞船操作符,//该操作符左边的数若大于右边的数就返回1//若该操作符左边的数小于右边的数则返回-1//若该操作符两边的数相等则返回0usort($asc, function($a, $b) {return ($a<=>$b);});print_r($asc);//desc是descend的缩写, 降序的意思$desc = $asc;//如需要降序结果, 则只需在使用<=>的表达式左边加上负号usort($desc, function($a, $b) {return -($a<=>$b);});print_r($desc);END
回调函数返回的整型值的取值范围是在PHP7.0之前是-2147483648 到 2147483647,PHP7.0之后是
如果从用于比较的回调函数返回一个非整型值,比如一个float浮点值,这个浮点值会被内部转换为回调函数所规定必须要要返回的整型值,比如返回浮点值0.8和0.3, 这两个浮点值都会被转换自己的整数部分,即0, 0.8和0.3都会被转换成0, 所以0.8和0.3的比较结果是相等的。