PHP:为会话分配多维数组
在项目中工作,并面临将多维数组分配给会话的挑战 项目信息: 公司需要在网站上注册/预订课程,公司可以注册多个课程,对于每个课程,公司必须指定候选人数量及其生物数据 例如: 如果XYZ公司注册了课程A、课程B和课程C,则为每门课程提供以下候选人信息:PHP:为会话分配多维数组,php,arrays,session,Php,Arrays,Session,在项目中工作,并面临将多维数组分配给会话的挑战 项目信息: 公司需要在网站上注册/预订课程,公司可以注册多个课程,对于每个课程,公司必须指定候选人数量及其生物数据 例如: 如果XYZ公司注册了课程A、课程B和课程C,则为每门课程提供以下候选人信息: <?php $all_reg_courses = array ( $course_id => array( "candidate_no" => $cand_no, "all_candidates" =>
<?php
$all_reg_courses = array
(
$course_id => array(
"candidate_no" => $cand_no,
"all_candidates" => array(
array
(
'cand_name' => 'Alex Holmes',
'cand_email' => 'al@yah.com',
'cand_sex' => 'Male',
'cand_phone' => '070043635690',
'cand_job' => 'IT'
),
array
(
'cand_name' => 'Tilla Reel',
'cand_email' => 'till@yah.com',
'cand_sex' => 'Female',
'cand_phone' => '0700833435690',
'cand_job' => 'HR'
),
array
(
'cand_name' => 'Bill Enya',
'cand_email' => 'bill@yah.com',
'cand_sex' => 'Male',
'cand_phone' => '07008055435690',
'cand_job' => 'Admin'
)
)
),
$course_id => array(
"candidate_no" => $cand_no,
"all_candidates" => array(
array
(
'cand_name' => 'Alan Pole',
'cand_email' => 'al@yah.com',
'cand_sex' => 'Male',
'cand_phone' => '07009973635690',
'cand_job' => 'IT'
),
array
(
'cand_name' => 'Coleen Curtis',
'cand_email' => 'cole@yah.com',
'cand_sex' => 'Female',
'cand_phone' => '5553435690',
'cand_job' => 'HR'
)
)
),
$course_id => array(
"candidate_no" => $cand_no,
"all_candidates" => array(
array
(
'cand_name' => 'Tamia James',
'cand_email' => 'tam@yah.com',
'cand_sex' => 'Female',
'cand_phone' => '7673435690',
'cand_job' => 'HR'
)
)
)
);
?>
为各种课程提供的这些数据以及为每门课程提名的候选人将临时存储在课程中,如果“XYZ公司”最终单击“最终提交按钮”,则最终将发送到数据库中,否则课程中的所有数据将在特定时间后销毁(即课程预订车将清空)
我一直在尝试将上面的示例多维数组分配到一个会话中,但它不仅起作用
正在获取错误消息:无法使用字符串偏移量
以下是将数组追加到会话的代码:
<?php
session_name("cand_cart");
session_start();
$c_id = $_POST['c_id'];
//$cand_no = $_POST['cand_no'];
$_SESSION['cand_cart']['c_id']['cands'] = array();
$_SESSION['cand_cart']['c_id'] = array();
$_SESSION['cand_cart']['c_id']['cand_no'] = array();
$_SESSION['cand_cart']['c_id']['cand_no'] = $_POST['cand_no'];
$_SESSION['cand_cart']['c_id'] = $_POST['c_id'];
//$candidates = array();
foreach ($_POST['candidate'] as $i => $can)
{
$candidates[$i] = array();
foreach ($can as $key => $value)
{
//$candidates[$i][$key] = $value;
$_SESSION['cand_cart']['c_id']['cands'][$i][$key] = $value;
}
}
echo '<pre>';
//var_dump($candidates);
print_r($_SESSION['cand_cart']);
echo '</pre>';
echo "<br><br>";
?>
<table border="1" cellspacing="0" cellpadding="6">
<thead>
<th>#</th>
<th>Name</th>
<th>Phone</th>
<th>Email</th>
<th>Sex</th>
<th>Position</th>
</thead>
<tbody>
<?php
foreach ($_SESSION['cand_cart'] as $i => $can)
{
$c = (object) $can;
$sn = $i + 1;
echo '<tr><td>' . $sn . '</td><td>' . $c->name . '</td><td>' . $c->phone . '</td><td>' . $c->email . '</td><td>' . $c->sex . '</td><td>' . $c->pos . '</td></tr>';
}
?>
</tbody>
</table>
#
名称
电话
电子邮件
性
位置
如果能得到这方面的帮助,我将不胜感激。。谢谢 尝试更改以下行:
$_SESSION['cand_cart']['c_id'] = array();
$_SESSION['cand_cart']['c_id']['cands'] = array();
到
您正在覆盖整个阵列,丢失以前存储的信息
// Build up your data-Array from the submitted values stored in $_POST
$data = array();
foreach($_POST['candidate'] AS $i => $can)
{
// Do your logic here, like you did before with the session
}
// Now serialize and store into session at once (= more performance)
$_SESSION['data'] = serialize($data);
在将数据存储到会话中之前,序列化和取消序列化数据要容易得多。这似乎更加轻量级,您不必专门设置每个值:
$data = unserialize($_SESSION['data']);
如果要在下一个请求中使用数据,则必须取消序列化:
希望这能有所帮助。PHP的确切错误是什么?@Rygu,“不能使用字符串偏移量;”写在这里。你有行号吗?它可能在这里`$\u会话['cand\u cart']['c\u id']['cands'][$i][$key]=$value;`因为你似乎从来没有让它下降到许多维度。不过,我会考虑使用适当的面向对象对象,而不是一个多维数组的杂音,它会困扰着你,无论你打算使用这个。OOP的发明是有原因的,PHP5完全面向对象也是有原因的。。。不过只是一个建议。谢谢!但是我如何在不覆盖会话的情况下将$_post['c_id']分配给会话?似乎不理解您的答案,因为这正是我在代码中的内容…如果您能更详细地介绍一下,我将不胜感激。谢谢,我消除了错误,它正在工作,但真正的问题是,我无法为会话分配多个课程id和候选人信息。i、 e新指定的课程信息集和指定的候选人信息覆盖会话中的现有数据。我需要存储多个课程信息和候选人信息。如果您能帮忙,我将不胜感激。
// Build up your data-Array from the submitted values stored in $_POST
$data = array();
foreach($_POST['candidate'] AS $i => $can)
{
// Do your logic here, like you did before with the session
}
// Now serialize and store into session at once (= more performance)
$_SESSION['data'] = serialize($data);
$data = unserialize($_SESSION['data']);