Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Бага в php?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
DeepVarvar Супермодератор
Отправлено: 17 Июля, 2012 - 15:02:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




PHP:
скопировать код в буфер обмена
  1. $a = array("a","b","c","d");
  2.  
  3. var_dump($a); // честно распечатал
  4. echo json_encode($a) . PHP_EOL; // ["a","b","c","d"]
  5.  
  6. unset($a[1]);
  7.  
  8. var_dump($a); // честно распечатал без удаленного
  9. echo json_encode($a) . PHP_EOL; // {"0":"a","2":"c","3":"d"} почему?
  10. // помог array_splice,
  11. // но почему не работал первый вариант?
 
 Top
Мелкий Супермодератор
Отправлено: 17 Июля, 2012 - 15:11:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




А что не так?
Во втором случае json_encode пытается сохранить ключи массива, тогда как в первом - ключи были очевидны.


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 17 Июля, 2012 - 15:12:27
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DeepVarvar
Все правильно. Ведь в первом случае у Вас есть последовательность ключей по порядку, которая, таким образом, может быть записана просто через запятую в формате json.
Однако если Вы удаляете ключ, как в примере выше, Ваши ключи уже не идет по порядку, и потому запись ["a","c","d"] не будет корректной, ведь она будет соответствовать (имею ввиду, если бы речь шла о представлении ассоциативного PHP-массива в json) в json ["0":a, "1":"c", "2":"d"] - что некорректно - ведь ключа "1" уже не существует, и, кроме того, остальные ключи тоже оказались бы перенумерованными.
Иными словами - запись через запятую может быть применена только когда она корректно интерпретирует массив в соответствии с тем, что есть в собственно PHP-записи (то есть индексы идут по порядку в обоих представлениях)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 17 Июля, 2012 - 15:12:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Мелкий пишет:
А что не так?

Преобразование ключей массива в имена свойств.
(Добавление)
EuGen пишет:
ведь она будет соответствовать в json ["0":a, "1":"c", "2":"d"]
если бы хотябы так, но он еще и в объект переделывает.
 
 Top
EuGen Администратор
Отправлено: 17 Июля, 2012 - 15:16:12
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DeepVarvar
В "объект" он переделывает, так как ассоциативных массивов в json не существует. То, что в ассоциативном массиве php есть ключ, интерпретируется в json как свойство объекта. Здесь тоже все логично. PHP не может интерпретировать в json последовательность ключей 0,2,3 иначе как в виде свойств объекта json. Повторюсь, перечисление a,c,d было бы некорректно.
(Скобки "[..]"я, вероятно, по случайности некорректно написал в предыдущем комментарии - имел ввиду объект "{..}")


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 17 Июля, 2012 - 15:22:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




EuGen пишет:
перечисление a,c,d было бы некорректно

?
Ааа, ну значит виновато опять это гнусное приведение типов, т.к. даже числовые ключи в php являются ассоциативными.
 
 Top
EuGen Администратор
Отправлено: 17 Июля, 2012 - 15:29:30
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DeepVarvar пишет:
$a = array("a","c","d");

Вы к чему? Записав таким образом, Вы получите массив с ключами 0,1,2. И в json он будет приведен к массиву. Не очень понимаю связь с рассматриваемым вопросом.
Вот если Вы запишете
PHP:
скопировать код в буфер обмена
  1. $a = array(0=>"a",1=>"b",2=>"c",3=>"d");
  2. echo json_encode($a) . PHP_EOL; // ["a","b","c","d"]
  3.  
  4. $b = array(0=>"a",2=>"c",3=>"d");
  5. echo json_encode($b) . PHP_EOL;//{"0":"a","2":"c","3":"d"}

- то, наверное, поймете, про что я сейчас речь вел. Приведение типов здесь не играет роли - дело лишь в том, возможно или нет представление конкретного массива PHP в виде массива или только объекта json.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 17 Июля, 2012 - 15:30:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




DeepVarvar пишет:
т.к. даже числовые ключи в php являются ассоциативными.

В PHP-то числовые ключи являются числами. А вот как в JSON записать числовые ключи, кроме как объектом?

DeepVarvar пишет:
$a = array("a","c","d");

Другие ключи значений.


-----
PostgreSQL DBA
 
 Top
Stierus Супермодератор
Отправлено: 17 Июля, 2012 - 15:33:24
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




php -r '$a = array("a","b","c","d"); var_dump($a); echo json_encode($a) . PHP_EOL; unset($a[1]); var_dump($a); echo json_encode($a) . PHP_EOL;'
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(1) "d"
}
["a","b","c","d"]
array(3) {
[0]=>
string(1) "a"
[2]=>
string(1) "c"
[3]=>
string(1) "d"
}
{"0":"a","2":"c","3":"d"}



все логично, не?
 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 17 Июля, 2012 - 15:48:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Stierus пишет:
все логично, не?
Это смотря с какой стороны смотреть Закатив глазки

Не логично:
У вас была корзина с четырьмя яблоками.
У вас забрали из корзины яблоко номер два.
Почему теперь яблоки в кастрюле? Куда делась корзина?

Логично:
Мы удалили второй элемент массива. Теперь все ключи (только в контексте js!) стали вдруг свойствами, а вот в php остались массивом, что и показывает var_dump.
А ну ка пример не на пыхе:
CODE (javascript):
скопировать код в буфер обмена
  1. var a = ["a","b","c","d"];
  2. delete a[1];
  3. console.log(a); // ["a",undefined,"c","d"]
  4. console.log(a.length); // 4

Ух-ты!

Ладно, не надо дальше перетирать, все логично... Радость

(Отредактировано автором: 17 Июля, 2012 - 15:49:41)

 
 Top
EuGen Администратор
Отправлено: 17 Июля, 2012 - 15:53:46
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DeepVarvar
unset и null - не одно и то же.
PHP:
скопировать код в буфер обмена
  1. $a=array('a','b', 'c','d');
  2. echo json_encode($a).PHP_EOL;
  3. $a[1]=null;
  4. echo json_encode($a).PHP_EOL;
  5. unset($a[1]);
  6. echo json_encode($a).PHP_EOL;

Идея, думаю, понятна. И потом, Ваш пример с javascript - все же имеет несколько иной смысл: ведь json_encode интерпретирует PHP-массив в формате json. Понять, что разница есть, несложно. Например:


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Тестирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB