powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP json_encode, почему иногда возвращается объект, а иногда массив?
30 сообщений из 30, показаны все 2 страниц
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910482
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получаю с сервера адресный справочник, состоящий из полей (столбцов) "Город", "Улица" и "Дом".
Из него создаю массив-кеш, который затем забирает клиентский js-скрипт.
Код такой:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
$rows = array(array('CITY'=>..., 'STREET'=>..., 'ADDRESS'=>...), ...);
$data = array();
foreach ($rows as $row)
{
	$c = $row['CITY'];
	if (!array_key_exists($c, $data)) $data[$c] = array();
	$s = $row['STREET'];
	if (!empty($s))
	{
		if (!array_key_exists($s, $data[$c])) $data[$c][$s] = array();
		$a = $row['ADDRESS'];
		if (!empty($a))
		{
			if (!in_array($a, $data[$c][$s])) $data[$c][$s][] = $a;
		}
	}
}
uksort($data, "strcmp");
foreach ($data as $a=>$value)
{
	uksort($data[$a], "strcmp");
	foreach ($data[$a] as $c=>$value)
	{
		natsort ($data[$a][$c]);
	}
}
echo json_encode($data, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);



Но вот JSON получается странный:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
json = {
    "Город": {
        "Улица1": [
            "39",
            "41"
        ],
        "Улица2": {
            "1": "2",
            "4": "4",
            "3": "6",
            "0": "8",
            "2": "47"
        },
        "Улица3": {
            "3": "3",
            "2": "18",
            "0": "24",
            "1": "26"
        },
        ...


Соответственно в клиентском коде у некоторых улиц (Улица1) номера домов являются array, а у некоторых улиц (Улица2) номера домов являются object.
Отчего так?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910500
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Посмотри в дебаггер с оптимизмом
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910579
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

на вход даешь кашу, он тебе на выходе её же и возвращает
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910617
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А намек можно дать, где каша?
У меня массив с тройной вложенностью, первые два уровня ассоциативные, третий обычный.
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910622
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

ну посмотри в дебагере чем они отличаются. эти входные третьего уровня.
мы тебе как поможем? если мы не знаем что точно у тебя на входе.
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910626
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Ваще-то в мануале достаточно подробно было когда объект а когда массив. Там вроде как даже параметр для управления есть ... не, не канает? ;)
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910635
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

ну не читает он мануал)
а если бы читал, увидел бы там что: Ассоциативный массив всегда отображается как объект
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910655
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uа если бы читал, увидел бы там что: Ассоциативный массив всегда отображается как объект
У меня код:
Код: php
1.
if (!in_array($a, $data[$c][$s])) $data[$c][$s][] = $a;


Откуда при таком коде на третьем уровне вложения может взяться ассоциативный массив?
К тому же из JSON видно, что у проблемных записей ключи вполне себе числовые, только почему-то json_encode посчитал их свойствами объекта. Как будто natsort превращает обычный массив в ассоциативный.

Кстати, если в моем коде после natsort выполнить такую строчку:
Код: php
1.
$data[$a][$c] = array_values($data[$a][$c]);


то проблема решается. Но непонятно, откуда после natsort в отсортированном массиве берутся ключи, в мануале про это не сказано.
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910657
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109Там вроде как даже параметр для управления есть ... не, не канает? ;)
Нет, там есть параметр всегда представлять данные, как объект (даже для пустых массивов).
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910660
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

1. ты знаешь чем отличаются ассоциативные массивы от обычных? если нет - дальше не читай, все равно непоймешь как найти ответ на свой вопрос.
2. раз в итоге у тебя получается такая фигня, значит туда попадает ассоциативный массив или объект. это факт. прими его и начни искать место где это происходит.
3. или ты хочешь сказать что у миллиона программисто по всему миру json_encode() работает корректно, а у тебя одного некорректно? если только ты сам её написал)
4. откуда и что там у тебя берется - тебе никто тут не ответит, ибо ты так и не удосужился предоставить нам пример входных данных
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910664
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Нет, там есть параметр всегда представлять данные, как объект (даже для пустых массивов).а обратного ключа не может быть впринципе. ибо таков формат json. ну нельзя представить в нем ассоциативные массивы или объекты в виде простого массива, без потери части информации. неужели непонятно
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910671
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется нашел причину.

r u1. ты знаешь чем отличаются ассоциативные массивы от обычных? если нет - дальше не читай, все равно непоймешь как найти ответ на свой вопрос.
В PHP? Ничем. Там все массивы ассоциативные.

Когда я добавляю элементы в массив на третьем уровне, он добавляется с автоматически нарастающим ключом (индексом). То есть получается [0=>'12', 1=>'16', ...].
natsort, судя по всему, сортирует по значениям, но сохраняет ключи (индексы).
Если элементы шли по возрастанию, то массив не изменяется, а если элементы переставлялись, то и индексы переставлялись вместе с элеменетами.
В результате, например для моего первого примера в "Улица3", из ['24', '26', '18', '3'] (вернее [0=>'24', 1=>'26', 2=>'18', 3=>'3']) получилось ['3'=>'3', '2'=>18', '0'=>24', '1'=>'26'].
Ну и поскольку в PHP нет обычных массивов, то json_encode видимо ориентируется на значения ключей — если они исключительно числовые, начинаются с 0 и идут по возрастанию и без дырок, то массив обычный, в остальных случаях ассоциативный.
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910673
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Но непонятно, откуда после natsort в отсортированном массиве берутся ключи, в мануале про это не сказано.
подсказка: а не в ключах массива ли дело?)
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910679
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Когда я добавляю элементы в массив на третьем уровне, он добавляется с автоматически нарастающим ключом (индексом). То есть получается [0=>'12', 1=>'16', ...].
natsort, судя по всему, сортирует по значениям, но сохраняет ключи (индексы).
Если элементы шли по возрастанию, то массив не изменяется, а если элементы переставлялись, то и индексы переставлялись вместе с элеменетами.
В результате, например для моего первого примера в "Улица3", из ['24', '26', '18', '3'] (вернее [0=>'24', 1=>'26', 2=>'18', 3=>'3']) получилось ['3'=>'3', '2'=>18', '0'=>24', '1'=>'26'].
Ну и поскольку в PHP нет обычных массивов, то json_encode видимо ориентируется на значения ключей — если они исключительно числовые, начинаются с 0 и идут по возрастанию и без дырок, то массив обычный, в остальных случаях ассоциативный.
тебе еще в самом начале сказали, отдебаж и посмотри в чем разница этих массивов.
даже в приведенном тобой коде видно, что ключи там неиндексированные. а раз так, то как еще можно сохранить информацию об этом в формате json? если представить их как обычный массив, то инф. о ключах то потеряется. а вдруг тебе это важно? потому так и кодируется, чтоб потом можно было восстановить "один в один".
видишь разобрался.
стоило тему заводить?
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910684
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

ещё вопрос - а не из базы ли получаются исходные данные?
смысл тогда во всех этих сортировках, если можно из базы взять отсортированные как нужно данные?
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910687
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.В PHP? Ничем. Там все массивы ассоциативные.
причем здесь php. вообще-то Простые и Ассоциативные массивы это понятия вне конкретного ЯП.
неважно как они устроены внутри. я могу на пхп работать с массивом как простым, а не ассоциативным. еще есть SplFixedArray, к сведению...
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910710
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-k2-смысл тогда во всех этих сортировках, если можно из базы взять отсортированные как нужно данные?
Натуральную сортировку БД делать не умеет.
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910718
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uесли представить их как обычный массив, то инф. о ключах то потеряется. а вдруг тебе это важно? потому так и кодируется, чтоб потом можно было восстановить "один в один".
Подобные вещи следует документировать.
В документации к uksort и uasort ясно сказано, что они сохраняют связь между ключами и значениями.
В документации к sort есть предупреждение, что sort не сохраняет связь между ключами и значениями (в отличии от asort).
В документации к natsort никаких особых замечаний нет, но я ожидал, что ее поведение будет схоже с sort, т.е. отсортированный массив будет переиндексирован.
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910720
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

а можно пример данных? а то я просто базист в прошлом, и как то привыкла
манипуляции с исходными данными по максимуму там делать, ибо для этого
они и придуманы
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910723
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например вот:
CITYSTREETADDRESSГородУлица139ГородУлица141ГородУлица22ГородУлица24ГородУлица247ГородУлица26ГородУлица28ГородУлица318ГородУлица324ГородУлица326ГородУлица33ГородУлица33/2ГородУлица36ГородУлица36АГородУлица37ГородУлица37АГородУлица4ПочтаГородУлица443БГородУлица4101ГородУлица4112ГородУлица4160АГородУлица4162ГородУлица4162АГородУлица4162БГородУлица5309ГородУлица5309АГородУлица5311ГородУлица5311АГородУлица5316ГородУлица5317А/1ГородУлица5317А/2ГородУлица5317А/3ГородУлица532ГородУлица5330ГородУлица5334ГородУлица5336ГородУлица5336АГородУлица5338ГородУлица534ГородУлица5346

В БД можно поэкспериментировать с регулярными выражениями для сортировки, но всех вариантов не предусмотреть.
Поэтому в данном случае нужную (натуральную) сортировку лучше делать на клиенте.
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910737
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.В документации к natsort никаких особых замечаний нет, но я ожидал, что ее поведение будет схоже с sort, т.е. отсортированный массив будет переиндексирован.
даже если бы это было описано в мануале, ты бы все равно не обратил на это внимания.
ты сам привел дамп своих выходных данных, где видно что ключи неупорядочены. тебе говорили - обрати внимание - чем они отличаются. но ты уперся как .... и продолжал спорить что с данными все ОК, а проблема где-то в json_encode() ...
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910751
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Поэтому в данном случае нужную (натуральную) сортировку лучше делать на клиенте.
варианты реализации натуральной сортировки в mysql гуглится за минуту
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910785
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uArhat109,

ну не читает он мануал)


Похоже на то. Вот ссыль, там можно переключать на русский и много каких языков по выбору: http://ru2.php.net ... далее "в путь". Открыто должно быть как только сел кодить. Читать про каждую используемую функцию ПЕРЕД использованием. :)
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910814
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

надеюсь у вас не слишком много адресов, не представляю как в таких условиях
выдать результат постранично: прийдется взять из базы все, отсортировать три раза,
разбить постраничку, возможно закешировать и в итоге выдать одну страницу
я бы переложила сортировки все-таки на бд
в крайнем случае, предусмотреть предварительные процедуры очистки и подготовки данных при зарузке
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910817
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-k2-,

обычно так и делают... БД должна отдавать ровно то что требуется "здесь и сейчас". :)
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910828
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uи продолжал спорить что с данными все ОК, а проблема где-то в json_encode() ...
Я такого не говорил.
Я говорил, что ассоциативному массиву браться неоткуда, данные в него добавляются как $array[]=$value.
Но дело оказалось в побочных эффектах natsort.

r uварианты реализации натуральной сортировки в mysql гуглится за минуту
Это какие же? С сортировкой вначале по длине поля, а затем по приводимому числовому значению?
Этот вариант неполноценный, он работает только для определенных входных данных, с произвольными значениями он будет работать неверно.
Варианты с регулярными выражениями получше, но на каждый случай регулярное выражение не заложишь.
Поэтому natsort на клиенте в данном случае лучше.

-k2-надеюсь у вас не слишком много адресов, не представляю как в таких условиях
Не более нескольких сотен.
Эти данные используются для выбора адреса (выпадающие списки "Населенный пункт", "Улица", "Дом").
Город и улицу я сортирую в БД, а номер дома сортируется на клиенте.
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38910857
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Этот вариант неполноценный, он работает только для определенных входных данных, с произвольными значениями он будет работать неверно.
мы говорим о конкретно ваших данных, а не о каких-то произвольно гипотетических.
приведите пример где, даже такое, решение неправильно отсортирует ваши номера домов? для небольшого обычного выпадающего списка думаю будет достаточно. хотя есть и другие решения. чуть сложнее, но зато сделали забыл. и ненужно на клиенте потом делать кучу сортировок вручную
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38911000
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uмы говорим о конкретно ваших данных, а не о каких-то произвольно гипотетических.
Конкретно в моих данных неправильно будут отсортированы дома "Почта", "317А/1", "317А/2", "317А/3".
Ну и некоторые другие.
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38911254
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор options

Битовая маска составляемая из значений JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT , JSON_UNESCAPED_UNICODE.
...
Рейтинг: 0 / 0
PHP json_encode, почему иногда возвращается объект, а иногда массив?
    #38911286
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пойму, чем это бы мне помогло.
Мне скорее нужно было что-то вроде JSON_FORCE_ARRAY.
Но не потребовалось, я выяснил, откуда брались ключи в массиве.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP json_encode, почему иногда возвращается объект, а иногда массив?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]