2016-07-23 4 views
2

У меня есть массив с идентификаторами как ключ и имя из связанной с ним базы данных. Я использую это для получения статистики из PHP для вывода на диаграмму Google, сгенерированную на JavaScript (через JSON). В PHP у меня есть следующий массив:сортировать объект по целочисленному ключу в 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 Диаграмма совпадает с неправильными метками.

Я решил это путем сортировки массива в PHP до того, как я прочитал статистику из базы данных. Мне нужно было ключи остаются теми же, хотя, это то, что я сделал в PHP:

$tmp = array_flip($a); 
asort($tmp); 
$a = array_flip($tmp); 

это дает мне массив в PHP, как это:

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

так что теперь в PHP foreach будет тот же порядок, что и for(i in ...) в JavaScript. Мне было интересно, есть ли более удобный способ сортировки моего массива в PHP вместо того, чтобы перевернуть его дважды - или - если есть опция для цикла в JavaScript, который не упорядочивает (допустимо запутывающие) целые значения ключей моего массива?

+0

во всяком случае, не вы предпочитаете делать что-то, чтобы массив не сортировался на стороне JS, и вы можете пропустить его так, как предполагалось? –

+0

Да, поэтому я разместил здесь весь этот случай. Я был немного озадачен тем, что PHP foreach так сильно отличался от JavaScripts for (var i in ... – patrick

+0

Некоторые браузеры реализуют объекты/массивы с сортировкой ключей, и вы ничего не можете сделать, чтобы изменить это. Однако вы можете использовать массив (с парами внутри), а не объект. –

ответ

1

Вы пробовали ksort?

ksort

(PHP 4, PHP 5, PHP-7) ksort - сортирует массив по ключевому

Описание

BOOL ksort (массив & $ массив [, Int $ sort_flags = SORT_REGULAR]) Сортирует массив по ключу, поддерживая ключ к корреляции данных. Это полезно в основном для ассоциативных массивов.

Если не очень хорошо иметь дело с числовыми ключами-строками можно использовать uksort и написать функцию сравнения с parseInt и spaceship operator (<=>).


Если вы, однако, хотите просто остановить полностью переназначение, altought вы не можете остановить «сортировку» объекта по его ключам (и обратите внимание, что это не является стандартным и браузер-зависимым: не все из них будут сортировать его), вы всегда можете использовать пары внутри массива, чтобы избежать изменений в исходный порядок элементов (пар, в данном случае):

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

+0

Ницца. Эти пары действительно хороший способ обойти эту сортировку! – patrick

1

Все, что вам нужно:

ksort($a) 

Результат:

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

, что делает намного больше смысла ... В одной попытке я попробовал это и убил индекс с ним (в итоге с помощью [0 => 'last', 1 => ' второй »и т. д.). Я попробовал это снова, и это сработало. Должно быть, я сделал что-то неправильно в первый раз. Спасибо за этот ответ! – patrick

Смежные вопросы