Будет ли порядок моего ассоциативного массива поддерживаться с PHP на Javascript? - PullRequest
5 голосов
/ 22 апреля 2010

В PHP я запускаю mysql_query с предложением ORDER BY.Затем я перебираю результаты для создания ассоциативного массива с ключом row_id.

Затем я вызываю json_encode для этого массива и выводю результат.

Эта страницазагружается с AJAX и определяется в переменной Javascript.Когда я переберу эту переменную Javascript, у меня все равно будет порядок, возвращенный из mysql_query?

Ответы [ 2 ]

11 голосов
/ 22 апреля 2010

Массивы PHP несколько уникальны по своему свойству поддержания порядка вставки.Javascript не имеет ассоциативных массивов как таковых.У него есть объекты, которые часто используются в качестве ассоциативных массивов.Они не гарантируют какой-либо конкретный порядок ключей.

Почему бы не вывести их в виде массива?Это будет иметь определенный порядок.Если вам нужен какой-то поиск ключей, почему заказ имеет значение?

5 голосов
/ 22 апреля 2010

То, что говорит Клетус, верно, но, по моему опыту, большинство браузеров будут поддерживать порядок. При этом вы должны рассмотреть возможность использования Array. Если вам нужно отсортировать его, как только вы получите его на стороне клиента, просто используйте функцию .sort() в JavaScript:

rows.sort(function(a, b) {
    return a.row_id - b.row_id;
}

Хотя кажется, что это работает, на порядок свойств объекта нельзя рассчитывать. Смотрите много комментариев ниже для получения дополнительной информации (умнее, чем у меня). Тем не менее, это был код, который я использовал для проверки поведения в моем собственном ограниченном тестировании:

var test = {
    one: 'blah',
    two: 'foo',
    another: 'bar'
};

for (prop in test) {
    document.write(prop + "<br />");
}

Печать (в Firefox 3.6.3 и Chrome 5.0.375.9):

one
two
another

Кроме того, вы можете быть уверены, что вы получаете требуемый тип кодировки JSON из json_encode(), например, объект (использует фигурные скобки {}), а не массив ([]) брекеты). Возможно, вам придется передать JSON_FORCE_OBJECT на json_encode(), чтобы форсировать его.

  • Отредактировано, чтобы уточнить, что подход Array предпочтителен)
  • Отредактировано снова (извините), так как я пропустил комментарий pcorcoran, в котором есть ссылка на проблему в трекере проблем Chromium по этому поводу. Достаточно сказать, что порядок свойств объекта не надежный.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...