我有一个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循环的选项,那么它不会对(整齐地说是令人困惑的)整数进行排序我的数组的值键?
答案 0 :(得分:2)
您是否尝试过ksort?
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']
];
答案 1 :(得分:1)
所有你需要的:
ksort($a)
结果:
[
14 => 'last',
25 => 'second',
33 => 'first',
]