在 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 中按整数键对对象进行排序的主要内容,如果未能解决你的问题,请参考以下文章