开发者

Copy a multi-dimentional array by Value (not by reference) in PHP

Language: PHP

I have a form which asks users for their educational details, course details and technical details. When the form is submitted the page goes to a different page to run processes on the information and save parts to a database. HOWEVER(!) I then need to return the page back to the original page, where having access to the original post information is needed.

I thought it would be simple to copy (by value) the multi-dimensional (md) $_POST array to $_SESSION['post']

session_start(); 
$_SESSION['post'] = $_POST;

However this only appears to place the top level of the array into $_SESSION['post'] not doing anything with the children/sub-arrays.

An abbreviated form of the md $_POST array is as follows:

Array
(
    [formid] => 2
    [edu] => Array
        (
            ['id'] => Array
                (
                    [1] => new_1
                    [2] => new_2
                )

            ['nameOfInstitution'] => Array
                (
                    [1] => 1
                    [2] => 2
                )

            ['qualification'] => Array
                (
                    [1] => blah 
                    [2] => blah
                )

            ['grade'] => Array
                (
                    [1] => blah
                    [2] => blah 
                )

        )

    [vID] => 61
    [Submit] => Save and Continue
)

If I echo $_SESSION['post']['formid'] it writes "2", and if I echo $_SESSION['post']['edu'] it returns "Array". If I check that edu is an array (is开发者_开发百科_array($_SESSION['post']['edu])) it returns true. If I echo $_SESSION['post']['edu']['id'] it returns array, but when checked (is_array($_SESSION['post']['edu]['id'])) it returns false and I cannot echo out any of the elements.

How do I successfully copy (by value, not by reference) the whole array (including its children) to an new array?

THANKS EVERYONE FOR RESPONDING - UPDATE

The issue was caused my irrelevant quote marks in the naming of fields in my form.


if this is your real print_r output, then you have some unwanted chars in your array keys.

Array
(
    [formid] => 2
    [edu] => Array //<--- $_SESSION['post']['edu']
        (
            ['id'] => Array // <---- $_SESSION['post']['edu']["'id'"]


I can't tell why this wouldn't work

session_start(); 
$_SESSION['post'] = $_POST;

On the 2nd page, do you call session_start() before accessing $_SESSION?

You could place this directly under session_start() to help debug.

var_dump($_SESSION);


You can use serialize () to convert the array to a string and either pass it by post or store it in the session.

I've noticed funny behaviour before in saving an array to $_SESSION in PHP. Sometimes if you make a reference and use that it's easier, for example:

$session =& $_SESSION['post'];

$session = array ();

Don't ask why though :)

Also, to expand on what haim evgi said in the comment, wrap the print_r in <pre> tags such as:

echo "<pre>";
print_r ($array);
echo "</pre>";

to make the array output readable.


DCD is on the right track.

Generally, I would store a serialized version of the form in the session and then unserialize it when I needed to use it.

To store it:

$_SESSION['post'] = serialize($_POST);

To retrieve it:

$post = unserialize( $_SESSION['post'] );


If you use echo in arrays, PHP will print "Array" instead of the array contents. Use print_r instead.

Your assignment only looks like it its by reference. Internally (to preserve memory) it is a reference until you change $_SESSION['post']. From that point onward, you will have two separate variables.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜