php二维数组排序

场景:数据来自于excel,读取出来是二维数组,需要按照指定字段排序,类似于sql的order by功能,代码如下:

```
class demo {
    public function test() {
        $arr = array(
            array(
                ‘power‘ => 380,
                ‘day‘ => 1,
                ‘where‘ => 1,
            ),
            array(
                ‘power‘ => 380,
                ‘day‘ => 2,
                ‘where‘ => 1,
            ),
            array(
                ‘power‘ => 400,
                ‘day‘ => 1,
                ‘where‘ => 1,
            ),
            array(
                ‘power‘ => 380,
                ‘day‘ => 3,
                ‘where‘ => 1,
            ),
            array(
                ‘power‘ => 400,
                ‘day‘ => 2,
                ‘where‘ => 1,
            ),
            array(
                ‘power‘ => 380,
                ‘day‘ => 8,
                ‘where‘ => 1,
            ),
            array(
                ‘power‘ => 380,
                ‘day‘ => 8,
                ‘where‘ => 2,
            ),
            array(
                ‘power‘ => 500,
                ‘day‘ => 1,
                ‘where‘ => 1,
            ),
            array(
                ‘power‘ => 380,
                ‘day‘ => 11,
                ‘where‘ => 1,
            ),
            array(
                ‘power‘ => 380,
                ‘day‘ => 5,
                ‘where‘ => 1,
            ),
        );

        $orderArr = array(
            ‘power‘ => ‘asc‘,
            ‘day‘ => ‘asc‘,
            ‘where‘ => ‘asc‘,
        );

        // 调用排序函数
        $this->sortBySelf($arr, $orderArr);

        var_dump($arr);die;
    }

    /**
     * 自定义排序.
     *
     * @param array $arr   要排序的数组.
     * @param array $order 排序规则.
     *
     * @return array.
     */
    private function sortBySelf(&$arr = array(), $order = array()) {
        if (empty($order)) {
            return $arr;
        }

        $sortFuncNameArr = array(
            ‘desc‘ => ‘descSortByKey‘,
            ‘asc‘ => ‘ascSortByKey‘,
        );

        $index = array();

        $i = 0;
        $keys = array_keys($order);
        foreach ($order as $key => $value) {
            if ($i == 0) {
                $funcName = $sortFuncNameArr[$value];
                usort($arr, self::$funcName($key));
                // 定义第一个字段排序完的index
                $index = $this->setIndex($arr, array_slice($keys,0,$i+1));
                $i++;
                continue;
            }

            if (empty($index)) {
                break;
            }

            foreach ($index as $beSortKey => $range) {
                if (count($range) <= 1) {
                    continue;
                }

                $tmpSortArr = array_slice($arr, $range[0], count($range), true);

                $funcName = $sortFuncNameArr[$value];
                usort($tmpSortArr, self::$funcName($key));

                array_splice($arr, $range[0], count($range), $tmpSortArr);

                // 定义index
                $index = $this->setIndex($arr, array_slice($keys,0,$i+1));
            }

            $i++;
        }

    }

    /**
     * 每次排序完设置分区.
     *
     * @param array $arr       要排序的数组.
     * @param array $beSortKey 已经排序完的字段.
     *
     * @return array.
     */
    private function setIndex($arr = array(), $beSortKey = array()) {
        $index = array();

        foreach ($arr as $arrKey => $value) {
            $real = ‘‘;
            for ($i = 0; $i < count($beSortKey); $i++) {
                $real .= $value[$beSortKey[$i]];
            }
            $index[$real][] = $arrKey;
        }

        return $index;
    }

    /**
     * 倒序回调函数.
     *
     * @param string $key 要排序的KEY.
     *
     * @return Closure.
     */
    public static function descSortByKey($key = ‘‘) {
        return function ($a, $b) use ($key) {
            if ($a[$key] == $b[$key])
                return 0;
            return ($a[$key] > $b[$key]) ? -1 : 1;
        };
    }

    /**
     * 正序回调函数.
     *
     * @param string $key 要排序的KEY.
     *
     * @return Closure.
     */
    public static function ascSortByKey($key = ‘‘) {
        return function ($a, $b) use ($key) {
            if ($a[$key] == $b[$key])
                return 0;
            return ($a[$key] < $b[$key]) ? -1 : 1;
        };
    }

}
```
时间: 2024-10-12 21:48:32

php二维数组排序的相关文章

写个函数用来对二维数组排序

29.写个函数用来对二维数组排序(新浪) Foreach有两种语法: 语法一:foreach($arr as $value){ Echo $value; } 语法一:foreach($arr as $key=>$value){ Echo $key . "=>" . $value; } 使用foreach遍历二维数组 与数组排序有关的函数: ?  sort():对数组元素的值升序排列,不保留索引关系 ?  rsort():对数组元素的值降序排列,不保留索引关系. ?  aso

写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数

下面代码没有认真看: <?php //二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序 function array_sort($arr, $keys, $order = 0) { if (!is_array($arr)) { return false; } $keysvalue = array(); foreach ($arr as $key => $val) { $keysvalue[$key] = $val[$keys]; } if ($

PHP 二维数组排序 可以按指定 键值排序

<?php header("Content-Type:utf-8"); $arr = array( 0 => array( 'name' => '国际原油价格', 'url_pinyin' => 'kucun', ), 1 => array( 'name' => '原油', 'url_pinyin' => 'jiage', ), 2 => array( 'name' => '原油价格', 'url_pinyin' => 'yu

js sort 二维数组排序的用法小结

最近在搞js 排序的问题,因为数据库排序太耗资源,如果能转移到客户端去排序,能大大D减少服务器内存消耗.客户端的话,除了js,就是as了,可惜我as学得太烂,所以只能选择js来研究研究了...经过我的测试,js内置方法sort的效率非常高 我们知道在js中默认提供了sort函数,但是这个函数默认是按照数组内容的ascii码升序进行排列的,如果我们要对二维数组排序要如何做呢?在php中是有multi_sort函数可供调用的,但是在js中似乎没有这种函数,但是没关系 ,因为js的sort函数其实也提

PHP_I love U之(1)php衣食父母:使用usort()函数为二维数组排序

<?php //PHP_I love U之(1)php衣食父母:使用usort()函数为二维数组排序 //PHP语言中使用usort()函数 为 二维数组排序: // [][]==  a[][1]= 长度; a[][2] = views点击数 $AAlong=10; //变量$AAlong 定义数组长度 //for ($i=0;$i<$AAlong;++$i)  //多维数组扩展时使用- //{ for($j=0;$j<$AAlong;++$j) //for j22  //这段给数组(用

php基础篇-二维数组排序 array_multisort

原文:php基础篇-二维数组排序 array_multisort 对2维数组或者多维数组排序是常见的问题,在php中我们有个专门的多维数组排序函数,下面简单介绍下: array_multisort(array1,sorting order, sorting type,array2,array3..)是对多个数组或多维数组进行排序的函数. array1 必需.规定输入的数组. sorting order 可选.规定排列顺序.可能的值是 SORT_ASC 和 SORT_DESC. sorting t

JS:二维数组排序和获取子级元素

JS:二维数组排序和获取子级元素 1. 二维数组排序 1.按数值排序 1 var arr = [[1, 2, 3], [7, 2, 3], [3, 2, 3]]; 如果我们要按每个子数组的第一列来排序要如何做呢,我们可以定义一个比较函数: 1 arr.sort(function(x, y){ 2 return x[0] – y[0]; 3 }); 这里的比较函数的作用是什么呢?其实是数组依次将数组元素复制给x,y,比如首先将arr[0]赋给x,arr[1]赋给y,然后用x[0] – y[0],根

php基础篇-二维数组排序姐妹篇

前面介绍了php多维数组排序的一个函数array_multisort() ,想了解的人可以点击 二维数组排序 array_multisort 下面介绍下不适用array_multisort()进行多维数组的排序. 这里介绍下2个php排序函数,一个是asort,一个是arsort. asort(array,sorttype) 函数对数组进行排序并保持索引关系.主要用于对那些单元顺序很重要的结合数组进行排序. 可选的第二个参数包含了附加的排序标识. SORT_REGULAR - 默认.以它们原来的

PHP二维数组排序(list_order)

/** * 对二维数组进行排序 * 模拟 数据表记录按字段排序 * * <code> * @list_order($list, $get['orderKey'], $get['orderType']); * </code> * @param array $array 要排序的数组 * @param string $orderKey 排序关键字/字段 * @param string $orderType 排序方式,'asc':升序,'desc':降序 * @param string

php对二维数组排序

<?php$src=Array(Array('username' => '0yl','accuracy' => 0.00),Array('username' => '11yl','accuracy' => 1.00),Array('username' => '12yl','accuracy' => 0.50),Array('username' => '13yl','accuracy' => 1.50));foreach($src as $key=>