在PHP中按整数键排序对象

时间:2016-07-23 02:50:40

标签: javascript php arrays sorting

我有一个ID为#的数组,以及与之关联的数据库中的名称。我使用它从PHP获取统计数据输出到用JavaScript生成的Google Chart(通过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中的foreach与JavaScript中的for( i in ...)具有相同的顺序。我想知道是否有一种更好的方法可以在PHP中对我的数组进行排序而不是将其翻转两次 - 或者 - 如果有一个JavaScript循环的选项,那么它不会对(整齐地说是令人困惑的)整数进行排序我的数组的值键?

2 个答案:

答案 0 :(得分:2)

您是否尝试过ksort

  

ksort

     

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

     

描述

     

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

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

但是,如果您想完全停止重新排序,那么您无法通过其键停止对对象的“排序”(并注意它不是标准的并且取决于浏览器:不是全部将它排序),你总是可以在数组中使用对来避免改变你原来的元素顺序(在这种情况下是对):

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

答案 1 :(得分:1)

所有你需要的:

ksort($a)

结果:

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