在 PHP 中按整数键对对象进行排序

Posted

技术标签:

【中文标题】在 PHP 中按整数键对对象进行排序【英文标题】:sort object by integer key in PHP 【发布时间】:2016-11-27 00:28:24 【问题描述】:

我有一个数组,其中 ID 作为键,并有一个来自与之关联的数据库的名称。我使用它从 php 获取统计信息,以输出到用 javascript(通过 JSON)生成的 Google 图表。在 PHP 中,我有以下数组:

$a = [ 
  '33' => 'first',
  '25' => 'second',
  '14' => 'last
];

如果我运行以下代码:

foreach( $a as $key => $val )
   echo "$key => $val" . PHP_EOL;

我得到以下(预期的)结果

   33 => first
   25 => second
   14 => last

我使用 AJAX 和 JSON 将它发送到 JavaScript 环境,在这里它变成了一个对象。现在,当我运行以下 JavaScript 时:

for( var i in a )
   console.log( i + " => " + a[i] );

我明白了

   14 => last
   25 => second
   33 => first

所以我的键被解释为整数并在 JavaScript 中排序,在这种情况下,这意味着我发送到 Google Chart 的包含统计信息的数组与错误的标签匹配。

在从数据库中读取统计数据之前,我通过在 PHP 中对数组进行排序解决了这个问题。不过,我需要密钥保持不变,这就是我在 PHP 中所做的:

 $tmp = array_flip( $a );
 asort( $tmp );
 $a = array_flip( $tmp );

这给了我这样的 PHP 数组:

[
   '14' => 'last',
   '25' => 'second',
   '33' => 'first'
]

所以现在 PHP 中的 foreach 将与 JavaScript 中的 for( i in ...) 具有相同的顺序。我想知道是否有更好的方法在 PHP 中对我的数组进行排序而不是翻转两次 - 或者 - JavaScript 中是否有一个循环选项不会对我的数组的(诚然令人困惑的)整数值键进行排序?

【问题讨论】:

不管怎样,你不是更喜欢做一些事情,这样数组就不会在 JS 端排序,你可以按照它应该的方式循环遍历它吗? 是的,这就是我在此处发布整个案例的原因。 PHP 的 foreach 与 JavaScript 的 for( var i in... 一些浏览器使用键排序实现对象/数组,您无法更改它。但是,您可以使用数组(内部包含对)而不是对象。 【参考方案1】:

你试过ksort吗?

排序

(PHP 4, PHP 5, PHP 7) ksort — 按键排序数组

说明

bool ksort (array &$array [, int $sort_flags = SORT_REGULAR]) 排序 按键数组,维护数据相关性的关键。这很有用 主要用于关联数组。

如果它不能很好地处理数字字符串键,您可以使用 uksort 并使用 parseInt 和 spaceship operator (<=>) 编写比较函数。


但是,如果您只想完全停止重新排序,尽管您无法通过键停止对象的“排序”(请注意,它不是标准的并且依赖于浏览器:并非所有将对其进行排序),您始终可以在数组中使用对以避免更改元素的原始顺序(在这种情况下为对):

$a = [ ['33', 'first'], ['25', 'second'], ['14', 'last'] ];

【讨论】:

不错的一个。这些对确实是绕过这种排序的好方法!【参考方案2】:

所有你需要的:

ksort($a)

结果:

[
    14 => 'last',
    25 => 'second',
    33 => 'first',
]

【讨论】:

这更有意义......在一次尝试中,我尝试了这个并用它杀死了索引(以 [0=>'last'、1=>'second' 等结束) ..我又试了一次,它奏效了。我一定是第一次做错了什么。感谢您的回答!

以上是关于在 PHP 中按整数键对对象进行排序的主要内容,如果未能解决你的问题,请参考以下文章

神奇的算法!看我如何用php实现计数排序

php 按特定键对多维数组进行排序

PHP 通过其中一个键对二维数组进行排序

PHP按另一个数组中的特定键对数组进行排序[重复]

如何在PHP中按值对对象数组进行排序

使用字典中的键对对象数组进行排序