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


sort object by integer key in PHP

我有一个以ID为键的数组,以及与之相关的数据库中的名称。我用它从PHP获取统计数据,并输出到用JavaScript生成的Google图表(通过JSON)。在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中的CCD_ 1将具有与JavaScript中的CCD_。我想知道是否有一种更好的方法可以在PHP中对数组进行排序,而不是翻转两次,或者是否有一个JavaScript中的循环选项可以不排序数组的整数值键(诚然令人困惑)?

您尝试过ksort吗?

ksort

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

说明

bool-ksort(array&$array[,int$sort_flags=sort_REGULAR])排序按键数组,保持键与数据的相关性。这很有用主要用于关联阵列。

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


然而,如果你想简单地完全停止重新排序,或者你不能停止按键对对象进行"排序"(请注意,这不是标准的,而且依赖于浏览器:不是所有的键都会对它进行排序),你可以总是在数组中使用对,以避免改变元素的原始顺序(在这种情况下是对):

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

您所需要的:

ksort($a)

结果:

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