如何在 PHP 中对数组和数据进行排序?

2024-05-10

这个问题旨在作为有关 PHP 中数组排序问题的参考。人们很容易认为您的特定案例是独特的并且值得提出新问题,但大多数实际上只是此页面上的解决方案之一的微小变化。

如果您的问题因与此问题重复而被关闭,请仅在您能解释为什么它与以下所有问题显着不同的情况下才要求重新打开您的问题。

如何在 PHP 中对数组进行排序?
我如何排序complexPHP 中的数组?
如何在 PHP 中对对象数组进行排序?


  1. 基本的一维数组;包括。多维数组,包括。对象数组;包括。根据一个数组对另一个数组进行排序 https://stackoverflow.com/a/17364128/476

  2. 使用 SPL 排序 https://stackoverflow.com/a/17364468/476

  3. 稳定排序 https://stackoverflow.com/a/17365409

有关使用 PHP 现有函数的实际答案,请参阅 1.,有关排序算法的学术详细答案(PHP 函数实现的以及您可以使用的排序算法)。may需要非常非常复杂的情况),请参阅 2。


基本一维数组

$array = array(3, 5, 2, 8);

适用的排序函数:

  • sort
  • rsort
  • asort
  • arsort
  • natsort
  • natcasesort
  • ksort
  • krsort

它们之间的区别仅仅在于是否保留键值关联(“a" 函数),无论是从低到高排序还是反向排序("r"),无论是对值还是键进行排序 ("k") 以及如何比较值 ("nat“与正常情况相比)。参见http://php.net/manual/en/array.sorting.php http://php.net/manual/en/array.sorting.php以获得概述和更多详细信息的链接。

多维数组,包括对象数组

$array = array(
    array('foo' => 'bar', 'baz' => 42),
    array('foo' => ...,   'baz' => ...),
    ...
);

如果你想排序$array通过每个条目的键“foo”,您需要一个自定义比较功能。以上sort相关函数处理简单的值,它们知道如何比较和排序。 PHP 并不只是“知道”如何处理复数值 like array('foo' => 'bar', 'baz' => 42)尽管;所以你需要告诉它。

为此,您需要创建一个比较功能。该函数需要两个元素并且必须返回0如果这些元素被认为是相等的,则值低于0如果第一个值低于且值高于0如果第一个值较高。这就是所需要的:

function cmp(array $a, array $b) {
    if ($a['foo'] < $b['foo']) {
        return -1;
    } else if ($a['foo'] > $b['foo']) {
        return 1;
    } else {
        return 0;
    }
}

通常,您会想要使用匿名函数 http://php.net/manual/en/functions.anonymous.php作为回调。如果您想使用方法或静态方法,请参阅在 PHP 中指定回调的其他方法 http://php.net/manual/en/language.types.callable.php.

然后您可以使用以下函数之一:

  • usort http://php.net/usort
  • uasort http://php.net/uasort
  • uksort http://php.net/uksort

同样,它们的区别仅在于是否保留键值关联并按值或键排序。阅读他们的文档了解详细信息。

用法示例:

usort($array, 'cmp');

usort将从数组中取出两项并调用您的cmp与他们一起运作。所以cmp()将被调用$a as array('foo' => 'bar', 'baz' => 42) and $b作为另一个array('foo' => ..., 'baz' => ...)。然后函数返回到usort哪个值更大或者它们是否相等。usort重复此过程,传递不同的值$a and $b直到数组排序完毕。这cmp函数会被调用多次,at least中的值有多少次$array,具有不同的值组合$a and $b每次。

要习惯这个想法,请尝试以下操作:

function cmp($a, $b) {
    echo 'cmp called with $a:', PHP_EOL;
    var_dump($a);
    echo 'and $b:', PHP_EOL;
    var_dump($b);
}

您所做的只是定义一种自定义方式来比较两个项目,这就是您所需要的。这适用于各种价值观。

顺便说一句,这适用于任何值,这些值不必是复杂的数组。如果您想要进行自定义比较,也可以对简单的数字数组进行比较。

sort按引用排序并且不返回任何有用的内容!

注意数组是排序的in place,您不需要将返回值分配给任何东西。$array = sort($array)将替换数组为true,而不是排序数组。只是sort($array); works.

自定义数字比较

如果你想按bazkey,它是数字,你需要做的就是:

function cmp(array $a, array $b) {
    return $a['baz'] - $b['baz'];
}

谢谢数学的力量这将返回一个值 0,具体取决于是否$a低于、等于或大于$b.

请注意,这不适用于float值,因为它们将减少到int并失去精度。使用显式-1, 0 and 1相反,返回值。

Objects

如果你有一个对象数组,它的工作方式是相同的:

function cmp($a, $b) {
    return $a->baz - $b->baz;
}

功能

您可以在比较函数中执行任何您需要的操作,包括调用函数:

function cmp(array $a, array $b) {
    return someFunction($a['baz']) - someFunction($b['baz']);
}

Strings

第一个字符串比较版本的快捷方式:

function cmp(array $a, array $b) {
    return strcmp($a['foo'], $b['foo']);
}

strcmp完全符合预期cmp在这里,它返回-1, 0 or 1.

宇宙飞船操作员

PHP 7 引入了宇宙飞船操作员 https://stackoverflow.com/a/31298778/476,它统一并简化了跨类型的等于/小于/大于比较:

function cmp(array $a, array $b) {
    return $a['foo'] <=> $b['foo'];
}

按多个字段排序

如果您想主要排序foo,但如果foo两个元素相等排序依据baz:

function cmp(array $a, array $b) {
    if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
        return $cmp;
    } else {
        return $a['baz'] - $b['baz'];
    }
}

对于熟悉的人来说,这相当于 SQL 查询ORDER BY foo, baz.
另请参阅这个非常简洁的速记版本 https://stackoverflow.com/a/22812695/476 and 如何为任意数量的键动态创建这样的比较函数 https://stackoverflow.com/a/22829326/476.

排序为手动静态顺序

如果您想将元素排序为“手动顺序”,例如“富”、“酒吧”、“巴兹”:

function cmp(array $a, array $b) {
    static $order = array('foo', 'bar', 'baz');
    return array_search($a['foo'], $order) - array_search($b['foo'], $order);
}

对于上述所有内容,如果您使用 PHP 5.3 或更高版本(您确实应该这样做),请使用匿名函数来缩短代码并避免出现另一个全局函数:

usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });

这就是对复杂的多维数组进行排序的简单方法。再说一次,只要考虑一下教 PHP 如何判断两项中哪一项“更大”;让 PHP 进行实际的排序。

此外,对于上述所有内容,要在升序和降序之间切换,只需交换$a and $b周围的争论。例如。:

return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending

根据一个数组对另一个数组进行排序

然后就是奇特的地方array_multisort http://php.net/array_multisort,它允许您根据一个数组对另一个数组进行排序:

$array1 = array( 4,   6,   1);
$array2 = array('a', 'b', 'c');

这里的预期结果是:

$array2 = array('c', 'a', 'b');  // the sorted order of $array1

Use array_multisort到那里:

array_multisort($array1, $array2);

从 PHP 5.5.0 开始,您可以使用array_column从多维数组中提取一列并在该列上对数组进行排序:

array_multisort(array_column($array, 'foo'), SORT_DESC, $array);

您还可以按任一方向对多个列进行排序:

array_multisort(array_column($array, 'foo'), SORT_DESC,
                array_column($array, 'bar'), SORT_ASC,
                $array);

从 PHP 7.0.0 开始,您还可以从对象数组中提取属性。


If you have more common cases, feel free to edit this answer.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 PHP 中对数组和数据进行排序? 的相关文章

  • 选择一组数字以达到最小总数的算法

    给定 一组数字n 1 n 2 n 3 n x 还有一个数字M 我想找到最好的组合 n a n b n c n gt M 该组合应达到达到或超过 M 所需的最小值 没有其他组合可以提供更好的结果 将在 PHP 中执行此操作 因此可以使用 PH
  • 防止 Propel 插入空字符串

    当未设置列时 如何防止 Propel ORM 插入空字符串 CREATE TABLE user uid INTEGER PRIMARY KEY AUTO INCREMENT email VARCHAR 255 NOT NULL UNIQUE
  • 如何检测字符串中的非 ASCII 字符?

    如果我有一个 PHP 字符串 如何以有效的方式确定它是否至少包含一个非 ASCII 字符 我所说的非 ASCII 字符是指不属于该表的任何字符 http www asciitable com http www asciitable com
  • 如何隐藏 URL 中的锚标记

    如何隐藏地址栏中以下链接 href 的哈希值 a href index php dev name 所以它会将我重定向到index php dev name 但我希望地址栏只显示index php 您可以使用 Javascript oncli
  • 从类似 cronjob 的语法创建“下次运行时间”日期

    在我正在创建的应用程序中 用户可以安排重复任务 生成间隔模式的简单值是 Minute 0 59 90 each minute Hour 0 23 90 each hour Day of month 1 31 90 each day of m
  • PHP - 类外 use 关键字和类内 use 关键字的区别

    伙计们 美好的一天 只是想问一下有什么区别use之外的class and use在 的里面class 我也用谷歌搜索过 但我的问题与答案不匹配 Example namespace App Http Controllers Auth use
  • 如何在HTML中的PHP中注释掉HTML和PHP?

    这是我想注释掉的一行代码 h1 class post title a href title a h1 一种流行的注释方法是分别注释 html 和 php 有一个更好的方法吗
  • 使用 Instagram Basic Display API 时出现“无效平台应用程序”错误

    我正在尝试使用 Instagram Basic 显示 API 但是当我发布授权代码以获取访问令牌时 我不断收到以下错误 error type OAuthException 代码 400 error message 平台应用无效 我正在遵循此
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 按范围迭代数组

    我有一个数组 1 2 3 4 5 6 100 我希望将此数组迭代 5 次 具体来说 取数组的前 5 个数字并获取平均值 继续处理接下来的 5 个数字并获取平均值 依此类推 我尝试过多种方法 例如Dequeue和 for 循环但未能获得所需的
  • 首先对列表中最长的项目进行排序

    我正在使用 lambda 来修改排序的行为 sorted list key lambda item item lower len item 对包含元素的列表进行排序A1 A2 A3 A B1 B2 B3 B 结果是A A1 A2 A3 B
  • 如何将 UDF 中的结构或类数组返回到数据帧列值中?

    d ID 1 pID 1000 startTime 2018 07 02T03 34 20 endTime 2018 07 03T02 40 20 ID 1 pID 1000 startTime 2018 07 02T03 45 20 en
  • WordPress 自定义帖子类型未显示在搜索结果中

    我在 WordPress 中遇到自定义帖子类型 测验 和搜索的问题 自定义帖子类型未显示在我的搜索结果页面中 我的搜索结果中仅显示默认的帖子内容 以下是我使用的代码 函数 php函数create posttype register post
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • 如何使用 php 在 sql 查询中转义引号?

    我有一个疑问 sql SELECT CustomerID FROM tblCustomer WHERE EmailAddress addslashes POST username AND Password addslashes POST p
  • phpActiveRecord 日期时间格式不正确

    当尝试使用 phpActiveRecord 在表中创建记录时 出现以下错误 Invalid datetime format 1292 Incorrect datetime value 2013 06 20 11 59 08 PDT for
  • 从字符串中获取数字

    我有一个字符串 例如 lorem 110 ipusm 我想获取 110 我已经尝试过这个 preg match all 0 9 string ret 但这正在返回 Array 0 gt 1 1 gt 1 2 gt 0 我想要这样的东西 Ar
  • PHP递归遍历对象树[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Javascript 中减少/分组数组

    基于this https stackoverflow com a 40774906 3254598例如 我想以稍微不同的方式按对象进行分组 结果应该如下 key audi items make audi model r8 year 2012
  • 如何使用 php 将 *.xlsb 转换为数组或 *.csv

    我正在尝试转换 xlsb文件到php array or csv文件 或至少 xls 我尝试使用PHPExcel 但看起来它无法识别该文件中的内容 我注意到 你可以重命名 xlsb文件到 zip文件 然后使用命令行解压缩unzip zip 之

随机推荐

  • 在 .vscode 中调试时遇到问题

    我最近在 VSCODE 中调试时遇到了一个大问题 我尝试通过搜索网站并重新安装一些扩展来自行修复它 而不是在中显示我的结果调试控制台它将以下输出写入我的terminal cd Users AVFL Documents Programming
  • 在 SPA 中加载外部脚本和样式文件

    我有一种 SPA 它使用 API 来获取数据 该 SPA 有一些实例 它们都使用通用样式和脚本文件 所以我的问题是 当我更改这些文件中的一行时 我将必须打开每个实例并更新文件 这对我来说真的很耗时 一种方法是将这些文件放在服务器中的文件夹中
  • 安装 ROS 时 Cmake 未检测到 boost-python

    我一直在尝试在我的 Mac 上安装 ROS 并根据不同版本的 boost 使用不同的库解决了错误 然而 似乎有一个库甚至没有检测到 boost python 这是我得到的错误 CMake Error at usr local share c
  • DevSettings.reload() 用于 React Native 中的注销

    问题 我正在将混合应用程序的注销功能从本机迁移到反应本机 要求 它可以在生产环境和设备上运行 它导航到应用程序的根屏幕 登录屏幕 它清除 redux 存储 很高兴有 它会取消任何飞行中的请求 最初 我们计划做这样的事情 如何重置 redux
  • 字符串格式化表达式 (Python)

    字符串格式化表达式 This is d s example 1 nice 字符串格式化方法调用 This is 0 1 example format 1 nice 我个人更喜欢方法调用 第二个示例 以提高可读性 但由于它是新的 因此随着时间
  • 无法在 css 中使用 .ani 光标?

    我自定义了网站的光标 但是CSS光标 url 仅适用于 gif png 或 cur 我想使用 ani 文件 但它只能在 IE 中使用 cursor url img mcursor cur auto IE 使用 Windows API 支持
  • 如何动态且安全地设置XUL密钥?

    我正在尝试为我的引导附加组件动态创建一个关键元素 目前 我创建了一个keyset元素并将其附加到document getElementById mainKeyset parentNode with appendChild 然后创建key元素
  • 更改二维数组元素的值会更改整个列

    当我打印我的arrvalue 我得到了 2D 数组的正确值 但是当我退出 while 循环时 我的值都是错误的 我不确定我做错了什么 num runs n 4 x np linspace 1 1 n y np linspace 1 1 n
  • 从 Eclipse IDE 在 Tomcat8 中部署 Maven 项目

  • Python错误代码:IndexError:索引错误列表索引超出范围

    我正在尝试用 Python 编写一个模拟赛马的函数 虽然没有获胜者 但它会清除屏幕 显示马匹列表 所有马匹的索引都从零开始 然后 在我标记的行上 代码变得混乱 我发现索引错误列表超出范围 我正在尝试随机选择一匹马 随机选择一个索引号 并将该
  • 哪里可以下载 JSTL jar [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道 因为我尝试过的所有地方似乎都超时了 您可以下载JSTL 1 1here http archiv
  • ruby 中的 unshift + file.join

    unshift File join File dirname FILE vendor addressable 2 1 0 lib addressable uri 上面的代码是否访问具有以下路径的文件 vendor addressable 2
  • 有没有办法从函数内单击导航链接?

    基本上 我正在延迟导航 单击链接后 onClick 处理程序通过检查条件并调用另一个函数来阻止导航 如果满足特定条件 则仅该页面导航到另一个页面 那么我如何从该函数中触发 Navlink 单击 我能够通过使用解决这个问题event prev
  • 表单请求中的 Laravel 数组验证

    我无法验证 Form Request 类中包含数组元素的字段 规则方法 public function rules return state gt required state 0 gt required state gt required
  • 如何在reactjs中重新加载组件(页面的一部分)?

    我当时正在做反应项目 当我们单击重新加载按钮时 我试图重新加载组件 我实现了 onClick 函数 如下所示 但它正在重新加载整个窗口 我只想重新加载该类组件 而不是整个窗口 谁能帮我解决这个问题吗 refreshPage window l
  • 我可以限制kafka-node消费者的消费吗?

    这看起来像我的 kafka 节点消费者 var kafka require kafka node var consumer new Consumer client 在某些情况下 获取的消息数量超出了我的处理能力 有没有办法限制它 例如每秒接
  • 解决 Three.js / webGL 中的 gl_PointSize 限制

    我正在使用 Three js 创建交互式数据可视化 此可视化涉及渲染 68000 个节点 其中每个不同的节点具有不同的大小和颜色 最初我尝试通过渲染网格来实现此目的 但事实证明这非常昂贵 我当前的尝试是使用 Three js 粒子系统 每个
  • Node.js 中的 http.request 是否有默认超时?

    在 Node js 中有一个服务器的默认超时 对于传入的 HTTP 请求 120000 毫秒 2 分钟 请参阅HTTP s server timeout文档 http nodejs org api http html http server
  • 在 pandas 中,如何对日期时间列进行 groupby weekday() ?

    我想过滤掉周末数据 只查看工作日的数据 周一 0 周五 4 我是 pandas 的新手 在 pandas 中实现此目的的最佳方法是什么 import datetime from pandas import data read csv dat
  • 如何在 PHP 中对数组和数据进行排序?

    这个问题旨在作为有关 PHP 中数组排序问题的参考 人们很容易认为您的特定案例是独特的并且值得提出新问题 但大多数实际上只是此页面上的解决方案之一的微小变化 如果您的问题因与此问题重复而被关闭 请仅在您能解释为什么它与以下所有问题显着不同的