关于javascript:在PHP中按整数键排序对象

sort object by integer key in PHP

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

1
2
3
4
5
$a = [
  '33' => 'first',
  '25' => 'second',
  '14' => 'last
];

如果我运行以下代码:

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

我得到以下(预期)结果

1
2
3
   33 => first
   25 => second
   14 => last

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

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

我得到

1
2
3
   14 => last
   25 => second
   33 => first

因此,我的键被解释为整数,并在javascript中排序,在本例中,这意味着我发送给谷歌图表的带有统计信息的数组与错误的标签匹配。

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

1
2
3
 $tmp = array_flip( $a );
 asort( $tmp );
 $a = array_flip( $tmp );

这给了我这样的PHP数组:

1
2
3
4
5
[
   '14' => 'last',
   '25' => 'second',
   '33' => 'first'
]

所以现在php中的foreach的顺序与javascript中的for( i in ...)的顺序相同。我想知道是否有一种更好的方法来用PHP对数组进行排序,而不是将其翻转两次——或者——是否有一个JavaScript循环的选项,它不会对数组的整数值键进行排序(当然是混淆的)?


你试过Ksort了吗?

ksort

(PHP 4, PHP 5, PHP 7) ksort — Sort an array by key

Description

bool ksort ( array &$array [, int $sort_flags = SORT_REGULAR ] ) Sorts
an array by key, maintaining key to data correlations. This is useful
mainly for associative arrays.

如果它不能很好地处理数字字符串键,您可以使用uksort,并用parseInt和宇宙飞船操作符(<=>编写比较函数。

但是,如果您只想完全停止重新排序,那么您也不能通过对象的键停止对象的"排序"(请注意,它不是标准的,并且依赖于浏览器:不是所有的键都会对其排序),您可以始终在数组中使用对,以避免更改元素的原始顺序(在本例中是对):

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


你所需要的一切:

1
ksort($a)

结果:

1
2
3
4
5
[
    14 => 'last',
    25 => 'second',
    33 => 'first',
]