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

问题描述 投票:0回答:2

我有一个以 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 中是否有一个循环选项不会对数组的整数值键进行排序(诚然令人困惑)?

php arrays sorting
2个回答
2
投票

您需要的一切:

ksort($a)

结果:

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

1
投票

你尝试过ksort吗?

排序

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

描述

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

如果它不能很好地处理数字字符串键,您可以使用 uksort 并使用

parseInt
spaceship 运算符 (
<=>
)
编写比较函数。


但是,如果您只想完全停止重新排序,尽管您无法停止按对象的键对对象进行“排序”(请注意,它不是标准的并且依赖于浏览器:并非所有对象都会排序它),您始终可以在数组中使用对,以避免更改元素的原始顺序(在本例中为对):

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

© www.soinside.com 2019 - 2024. All rights reserved.