Checkbox数组到字符串帮助:Implode $ _POST并将值返回到相同的$ _POST?

时间:2011-05-09 20:24:00

标签: php arrays string implode

我正在尝试将简短表单的结果存储到平面文件(例如.text文件)。该文件将作为分隔文件导入Excel。表单有复选框,因此可以设置为数组:

<input type="hidden" name="roflz" value="noresponse">
<input type="checkbox" name="roflz[]" value="Yesroflz" id="Yesroflz" <?php if (isset($_SESSION['roflz']) && $_SESSION['rolfz'] == "Yesroflz") { echo 'checked="checked"'; } ?>> <label for="Yesroflz">Yesroflz</label> <br />
<input type="checkbox" name="roflz[]" value="Moreroflz" id="Moreroflz" <?php if (isset($_SESSION['roflz']) && $_SESSION['roflz'] == "Moreroflz") { echo 'checked="checked"'; } ?>> <label for="Moreroflz">Moreroflz</label><br />

是否可以从$_POST['rolfz']内爆数组并将结果返回到$_POST['rolfz']?期望的结果是我可以存储到文本文件中的字符串。请参阅以下代码:

<?php
// begin the session
ini_set('session.cache_limiter', 'private');
session_start();
//Turn checkboxes (an array) into a string. So we can later store it into a strong. 
if(isset($_POST['rolfz'])){
    $_POST['rolfz'] = implode(",",$_POST['rolfz']);
    }

总体目标是将$ _SESSION中的所有值存储到文本文件中。但是,当我尝试运行代码时,我得到“注意:数组在第14行的E:\ cgi-bin \ thankyou.php中进行字符串转换”。错误告诉我在下面的代码中我试图将数组用作字符串。

// Take each input name and create a variable for it
foreach($_POST as $k=>$v) {
$_SESSION[$k]=$v;
}
//Implodes the array so we can store the values as a string (not the variables name though!)
$results = implode("|", $_SESSION);
//Open up the file that we will store the collected information to
$datafile=fopen("V1.txt","a") or exit("Unable to open file to record data!");
//Write the data on a new line ("\r\n") so we don't over-write the existing data
fwrite($datafile, "\r\n".$results);
//Close out the file
fclose($datafile);
//reset session variables and destroy the session
$_SESSION = array();
session_destroy();
?>

如果我正在做的是错误的或不可能的,是否可以为foreach($_POST as $k=>$v)使用替代语句,以便它忽略$_POST['rolfz']?这样我可以自己处理$_POST['rolfz']吗?

编辑(5/10/11): 在爆炸之前:

array(5) { ["date"]=> string(10) "05/10/2011" ["time"]=> string(11) "09:11:20 AM" ["gender"]=> string(4) "male" ["lolz"]=> string(7) "YesLOLZ" ["roflz"]=> array(2) { [0]=> string(8) "Yesroflz" [1]=> string(7) "Noroflz" } } 

爆炸后:

array(5) { ["date"]=> string(10) "05/10/2011" ["time"]=> string(11) "09:11:20 AM" ["gender"]=> string(4) "male" ["lolz"]=> string(7) "YesLOLZ" ["roflz"]=> array(2) { [0]=> string(8) "Yesroflz" [1]=> string(7) "Noroflz" } } 

编辑(5/10/11): 如果您正在尝试执行类似的解决方案,请参阅Michael的解决方案。请注意,我是一个白痴,并在我的代码中使用了错误的复选框名称(它应该是roflz而不是rolfz)。

1 个答案:

答案 0 :(得分:0)

编辑:在尝试var_dump($_SESSION)之前一定要implode(),以防其中已有其他阵列。

所以您的错误似乎是$_POST包含数组,并且您正在将$_POST直接转换为$_SESSION,然后尝试implode()将其转换为字符串。 。 implode()绊倒那个阵列。

您可以非常简单地忽略$_SESSION['rolfz']

foreach($_POST as $k=>$v) {
  if ($k != 'rolfz') {
    $_SESSION[$k]=$v;
  }
}

然后按照你的建议用其他方法处理它。

更好的是,将$_POST按原样存储到$_SESSION,但使用其他临时数组来过滤掉rolfz

$_SESSION = $_POST; // will overwrite anything already in $_SESSION

$tmp_array = array();
foreach($_POST as $k=>$v) {
  if ($k != 'rolfz') {
    $tmp_array[$k]=$v;
  }
}

// Then implode() $tmp_array and write to file.

编辑2011年5月11日: 由于覆盖$_POST似乎不起作用,请尝试使用中间值并删除orignial rolfz密钥:

if (isset($_POST['rolfz'])) {
  $temp = implode(",", $_POST['rolfz']);
  unset($_POST['rolfz']);
  $_POST['rolfz'] = $temp;
}