PHP, многомерные массивы
3 июня 2008
Всё описанное ниже успешно опровергнуто в комментариях.
Всё, как и ожидается. В $new_arr будет копия $arr:
$arr = array( 'one' => 'val_one', 'two' => 'val_two' ); $new_arr = $arr;
А вот тут не всё так просто… вместо массива $subarr в $new_arr будет ссылка на него.
$subarr = array( 'one_one' => 'val_one_one' ); $arr = array( 'one' => $subarr ); $new_arr = $arr;
Комментарии RSS по email OK
В принпипе, это очевидно. Для того чтобы была копия во втором случае, надо было писать что-то вроде $_t = $subarr
т.е. $_t = $subarr? Что за $_t? Нам нужен в итоге $new_arr['one']['one_one'].
Я имел в виду что-то наподобие
$arr = array(
'one' => ($_t = $subarr)
);
хотя выглядит конечно ужасно
И чем это будет отличаться от приведённого мной кода?
Не согласен.
<?php
$subarr = array(
'one_one' => 'val_one_one'
);
$arr = array(
'one' => $subarr
);
$new_arr = $arr;
$subarr['one_one'] = 'test';
var_dump($new_arr);
?>
array(1) { ["one"]=> array(1) { ["one_one"]=> string(11) "val_one_one" } }
т.е. массив не передавался по ссылке. В мануале написано, русским по белому - «Обратите внимание, что при присваивании массива всегда происходит копирование значения. Чтобы копировать массив по ссылке, вам нужно использовать оператор ссылки.»
PHP 5.2.4
Да, всё так, но только не для вложенных массивов. Проверьте.
К примеру, засуньте $_POST с вложенными массивами в $_SESSION и посмотрите на следующей странице.
Во первых, так и надо писать, мол, при сохранении массива POST в массиве SESSION он передается по ссылке... хотя у меня все равно не передается, смотрите:
session_start();
$_POST[md5(rand(1,100))] = array(md5(rand(1,100)),md5(rand(1,100)),md5(rand(1,100)),);
$_SESSION['demo'] = $_POST;
echo '
var_dump($_SESSION);
echo 'Еще разок!';
Или я что то не так опять прочитал?
Мдя… видно я что-то перепутал и есть ещё какие-то условия для того, что я описал.
Огромное спасибо за пример, который всё замечательно опроверг.
А может, было в какой другой версии?
Да нет, проверял на той же, где и проявлялось…