在PHP中通过Value(而不是引用)复制多维数组

时间:2010-03-25 10:28:15

标签: php copy multidimensional-array

语言:PHP

我有一个表格,询问用户的教育详情,课程详情和技术细节。提交表单后,页面将转到另一个页面以对信息运行进程并将部件保存到数据库。 HOWEVER (!)然后我需要将页面返回到原始页面,在那里需要访问原始帖子信息。

我认为将多维(md)$ _POST数组复制(按值)到$ _SESSION ['post']

会很简单
session_start(); 
$_SESSION['post'] = $_POST;

然而,这似乎只是将数组的顶层放入$ _SESSION ['post']而没有对子/子数组做任何事情。

md $ _POST数组的缩写形式如下:

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
)

如果我回显$ _SESSION ['post'] ['formid'],则会写入“2”,如果我回显$ _SESSION ['post'] ['edu'],则返回“Array”。如果我检查edu是一个数组(is_array($ _ SESSION ['post'] ['edu]))它返回true。如果我回显$ _SESSION ['post'] ['edu'] ['id']它返回数组,但是当检查时(is_array($ _ SESSION ['post'] ['edu] ['id']))它返回是的,我无法回应任何元素。

如何将整个数组(包括其子代)成功复制(按值,而不是通过引用)到新数组?

感谢每个人的回应 - 更新
这个问题在我的表单中命名字段时引起了我无关的引号。

5 个答案:

答案 0 :(得分:2)

我不知道为什么这不起作用

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

在第二页上,您是否在访问session_start()之前致电$_SESSION

您可以将其直接放在session_start()下以帮助调试。

var_dump($_SESSION);

答案 1 :(得分:2)

如果这是你真正的print_r输出,那么你的数组键中就会有一些不需要的字符。

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

答案 2 :(得分:1)

您可以使用serialize()将数组转换为字符串,并通过post传递或将其存储在会话中。

在将数组保存到PHP中的$ _SESSION之前,我注意到了一些有趣的行为。有时,如果你做一个参考并使用它更容易,例如:

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

$session = array ();

不要问为什么:)

另外,要扩展评论中所说的haim evgi,请将print_r包装在<pre>标签中,例如:

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

使数组输出可读。

答案 3 :(得分:1)

DCD走在正确的轨道上。

通常,我会在会话中存储表单的序列化版本,然后在需要使用它时将其反序列化。

存储它:

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

要检索它:

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

答案 4 :(得分:0)

如果在数组中使用echo,PHP将打印“Array”而不是数组内容。请改用print_r

您的作业仅供参考。在内部(为了保留记忆),在您更改$_SESSION['post']之前,它是一个参考。从那时起,您将有两个独立的变量。