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
Форумы портала PHP.SU :: Версия для печати :: Бага в php?
Форумы портала PHP.SU » Разное » Тестирование » Бага в php?

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

1. DeepVarvar - 17 Июля, 2012 - 15:02:44 - перейти к сообщению
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. // но почему не работал первый вариант?
2. Мелкий - 17 Июля, 2012 - 15:11:11 - перейти к сообщению
А что не так?
Во втором случае json_encode пытается сохранить ключи массива, тогда как в первом - ключи были очевидны.
3. EuGen - 17 Июля, 2012 - 15:12:27 - перейти к сообщению
DeepVarvar
Все правильно. Ведь в первом случае у Вас есть последовательность ключей по порядку, которая, таким образом, может быть записана просто через запятую в формате json.
Однако если Вы удаляете ключ, как в примере выше, Ваши ключи уже не идет по порядку, и потому запись ["a","c","d"] не будет корректной, ведь она будет соответствовать (имею ввиду, если бы речь шла о представлении ассоциативного PHP-массива в json) в json ["0":a, "1":"c", "2":"d"] - что некорректно - ведь ключа "1" уже не существует, и, кроме того, остальные ключи тоже оказались бы перенумерованными.
Иными словами - запись через запятую может быть применена только когда она корректно интерпретирует массив в соответствии с тем, что есть в собственно PHP-записи (то есть индексы идут по порядку в обоих представлениях)
4. DeepVarvar - 17 Июля, 2012 - 15:12:37 - перейти к сообщению
Мелкий пишет:
А что не так?

Преобразование ключей массива в имена свойств.
(Добавление)
EuGen пишет:
ведь она будет соответствовать в json ["0":a, "1":"c", "2":"d"]
если бы хотябы так, но он еще и в объект переделывает.
5. EuGen - 17 Июля, 2012 - 15:16:12 - перейти к сообщению
DeepVarvar
В "объект" он переделывает, так как ассоциативных массивов в json не существует. То, что в ассоциативном массиве php есть ключ, интерпретируется в json как свойство объекта. Здесь тоже все логично. PHP не может интерпретировать в json последовательность ключей 0,2,3 иначе как в виде свойств объекта json. Повторюсь, перечисление a,c,d было бы некорректно.
(Скобки "[..]"я, вероятно, по случайности некорректно написал в предыдущем комментарии - имел ввиду объект "{..}")
6. DeepVarvar - 17 Июля, 2012 - 15:22:28 - перейти к сообщению
EuGen пишет:
перечисление a,c,d было бы некорректно

?
Ааа, ну значит виновато опять это гнусное приведение типов, т.к. даже числовые ключи в php являются ассоциативными.
7. EuGen - 17 Июля, 2012 - 15:29:30 - перейти к сообщению
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.
8. Мелкий - 17 Июля, 2012 - 15:30:19 - перейти к сообщению
DeepVarvar пишет:
т.к. даже числовые ключи в php являются ассоциативными.

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

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

Другие ключи значений.
9. Stierus - 17 Июля, 2012 - 15:33:24 - перейти к сообщению
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"}



все логично, не?
10. DeepVarvar - 17 Июля, 2012 - 15:48:59 - перейти к сообщению
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

Ух-ты!

Ладно, не надо дальше перетирать, все логично... Радость
11. EuGen - 17 Июля, 2012 - 15:53:46 - перейти к сообщению
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. Понять, что разница есть, несложно. Например:
PHP:
скопировать код в буфер обмена
  1. $a=array('a','b', 'c', INF);
  2. echo json_encode($a).PHP_EOL;

 

Powered by ExBB FM 1.0 RC1