PHP 二维数组排序保持键名不变

对二维数组指定的键名排序,首先大家想到的是array_multisort函数,关于array_multisort的用法我之前也写了一篇
废话不多言,我们看个实例:

<?php
$data = array(    1001 => array(        ‘age‘ => 22,        ‘name‘ => ‘鸠摩智‘    ),    1007 => array(        ‘age‘ => 21,        ‘name‘ => ‘慕容复‘    ),    1004 => array(        ‘age‘ => 27,        ‘name‘ => ‘乔帮主‘    ));
//根据字段age对数组$data进行降序排列 

$ages = array_column($data, ‘age‘); 

array_multisort($ages, SORT_ASC, $data); 

print_r($data);

细心的朋友会看到,键名重置了,键名从0开始,显然这可能不是我们想要的结果,那如何保持键名不变?

我们再看个示例:

$data = array(
    1001 => array(
        ‘age‘ => 22,
        ‘name‘ => ‘鸠摩智‘
    ),
    1007 => array(
        ‘age‘ => 21,
        ‘name‘ => ‘慕容复‘
    ),
    1004 => array(
        ‘age‘ => 27,
        ‘name‘ => ‘乔帮主‘
    )
);
//根据字段age对数组$data进行降序排列
$data = arraySort($data, "age", "desc" );
print_r($data);

/**
 * @desc arraySort php二维数组排序 按照指定的key 对数组进行自然排序
 * @param array $arr 将要排序的数组
 * @param string $keys 指定排序的key
 * @param string $type 排序类型 asc | desc
 * @return array
 */
function arraySort($arr, $keys, $type = ‘asc‘)
{
    $keysvalue = $new_array = array();
    foreach ($arr as $k => $v) {
        $keysvalue[$k] = $v[$keys];
    }

    if ($type == ‘asc‘) {
        natsort($keysvalue);
    }
    if ($type == ‘desc‘) {
        natsort($keysvalue);
        $keysvalue = array_reverse($keysvalue, TRUE); // 将原数组中的元素顺序翻转,如果第二个参数指定为 true,则元素的键名保持不变
    }
    foreach ($keysvalue as $k => $v) {
        $new_array[$k] = $arr[$k];
    }
    return $new_array;
}

这里我们也可以精简下arraySort函数,处理结果相同:

/**
 * @desc arraySort php二维数组排序 按照指定的key 对数组进行自然排序
 * @param array $arr 将要排序的数组
 * @param string $keys 指定排序的key
 * @param string $type 排序类型 asc | desc
 * @return array
 */
function arraySort($arr, $keys, $type = ‘asc‘)
{
    $keysvalue = $new_array = array();
    foreach ($arr as $k => $v) {
        $keysvalue[$k] = $v[$keys];
    }

    $type == ‘asc‘ ? asort($keysvalue) : arsort($keysvalue);
    foreach ($keysvalue as $k => $v) {
        $new_array[$k] = $arr[$k];
    }
    return $new_array;
}

从上面的结果我们看到:

键名保持了不变,实现的原理很简单,先取出键名,然后对键名排序,再根据对应的键名赋值组成新数组返回。
大家可以看到,这里我们主要用到了php的几个核心的排序函数

asort() 对关联数组按照键值进行升序排序。

arsort() 函数对关联数组按照键值进行降序排序。

natsort() 实现了“自然排序”,即数字从 1 到 9 的排序方法,字母从 a 到 z 的排序方法,短的优先。数组的索引与单元值保持关联,
注意:在自然排序算法中,数字 2 小于 数字 10。在计算机排序算法中,10 小于 2,因为 "10" 中的第一个数字小于 2。

原文地址:https://www.cnblogs.com/phpper/p/10427969.html

时间: 2024-08-29 00:56:04

PHP 二维数组排序保持键名不变的相关文章

php二维数组修改键名

最近遇到一个问题,是关于json数据提交的时候,总是报出[object object]的错误,查了晚上需要资料,大部分的说法是json数据格式不规范导致的错误.一般建议说将dataType类型注释掉.但是都试了一下都没有解决.最后还怀疑是使用json_encode这个函数php版本的问题等等,都没有解决.主要我后台提交过来的是一个一维数组,而且还没有键值的一维数组.因此有同事说我的json数据格式不规范,必须要有键和值.这个我键蛋疼了,本来使用thinkphp的方式查出的数据就是二维数组,进行数

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

PHP二维数组排序(感谢滔哥)

滔哥原创 /*                     _ooOoo_                    o8888888o                    88" . "88                    (| -_- |)                    O\  =  /O                 ____/`---'\____               .'  \\|     |//  `.              /  \\|||  :  |

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

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

PHP二维数组排序函数

PHP一维数组的排序可以用sort(),asort(),arsort()等函数,但是PHP二维数组的排序需要自定义. 以下函数是对一个给定的二维数组按照指定的键值进行排序,先看函数定义: function array_sort($arr,$keys,$type='asc'){ $keysvalue = $new_array = array(); foreach ($arr as $k=>$v){ $keysvalue[$k] = $v[$keys]; } if($type == 'asc'){

PHP排序算法:二维数组排序

二维数组排序,比如一个学生成绩数组: $arr[] = array('name'=>'a','score'=>9); $arr[] = array('name'=>'c','score'=>4); $arr[] = array('name'=>'d','score'=>1); $arr[] = array('name'=>'b','score'=>3); $arr[] = array('name'=>'f','score'=>2); $arr[]

写一个二维数组排序算法函数,能够具有通用性,可以调用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 按二维数组的键值排序

/** * 按二维数组的键值排序 * @param unknown $array 二维数组 * @param unknown $key 二维数组的键值 * @param string $order 升序/降序 * @return multitype:unknown 返回排序后的数组 */ public static function arr_sort_in_key($array, $key, $order = "asc") { $arr_nums = $arr = array(); f

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

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