<rmcreative>

RSS

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

  1. №311
    haspadar
    haspadar 03.06.2008, 17:24:30

    В принпипе, это очевидно. Для того чтобы была копия во втором случае, надо было писать что-то вроде $_t = $subarr

  2. №312
    Sam
    Sam 03.06.2008, 17:48:12

    т.е. $_t = $subarr? Что за $_t? Нам нужен в итоге $new_arr['one']['one_one'].

  3. №313
    haspadar
    haspadar 03.06.2008, 18:34:52

    Я имел в виду что-то наподобие

    $arr = array(

    'one' => ($_t = $subarr)

    );

    хотя выглядит конечно ужасно

  4. №314
    Sam
    Sam 03.06.2008, 19:03:07

    И чем это будет отличаться от приведённого мной кода?

  5. №315
    Олег Гобунов
    Олег Гобунов 04.06.2008, 7:29:50

    Не согласен.

    <?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

  6. №319
    Sam
    Sam 04.06.2008, 12:58:52

    Да, всё так, но только не для вложенных массивов. Проверьте.

    К примеру, засуньте $_POST с вложенными массивами в $_SESSION и посмотрите на следующей странице.

  7. №322
    Олег Горбунов
    Олег Горбунов 04.06.2008, 15:25:38

    Во первых, так и надо писать, мол, при сохранении массива 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 'Еще разок!';

    Или я что то не так опять прочитал?

  8. №323
    Sam
    Sam 04.06.2008, 15:59:10

    Мдя… видно я что-то перепутал и есть ещё какие-то условия для того, что я описал.

    Огромное спасибо за пример, который всё замечательно опроверг.

  9. №327
    Олег Горбунов
    Олег Горбунов 04.06.2008, 21:50:01

    А может, было в какой другой версии?

  10. №332
    Sam
    Sam 05.06.2008, 18:43:21

    Да нет, проверял на той же, где и проявлялось…

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.