【问题标题】:How to get an array value after explode?爆炸后如何获取数组值?
【发布时间】:2013-05-29 15:00:46
【问题描述】:

我已经在数组中将一个值从一个页面传递到另一个页面。我可以通过explode 提取前两个变量,但我无法得到在数组中形成的第三个值。

这是我的数组:

$user_rate=$_POST['user_rate'];//15000|ss|Array
list($total,$promo,$rate)=explode("|",$user_rate);

所以我得到:

$total=15000;
$promo=ss;
$rate=Array;

而 Array 来自上一页,通过循环每日汇率并放入数组中。我需要知道每个费率是多少,所以我写道:

foreach($rate as $val){
echo "$val<br>";
}

但它什么也没显示。我怎样才能得到这个?

更新:这是发送 var 之前的代码。

echo "
<tr>
<td align=\"right\" colspan=\"3\">Total</td>
<td align=\"right\"><label for=\"promo_3\"><input type=\"radio\" name=\"user_rate\" id=\"promo_3\" value=\"$ss_total|ss|$cost_ss\" />&nbsp;<u><b>".number_format($ss_total)."</b></u></label></td>
<td align=\"right\"><label for=\"promo_1\"><input type=\"radio\" name=\"user_rate\" id=\"promo_1\" value=\"$net_total|nc|$cost_nr\" checked/>&nbsp;<u><b>".number_format($net_total)."</b></u></label></td>
</tr>";

这种格式的值不能改变,因为我需要它用于以后的 JAVASCRIPT 提取

$cost_ss$cost_nr 源自数据库查询循环。

while($rec=mysql_fetch_array($result)){
$cost_ss[]=$rec['rate_ss'];
$cost_nr[]=$rec['rate_nr'];
}

【问题讨论】:

  • 你认为字符串如何扩展为 PHP 数组?使用序列化/json
  • 做 var_dump($rate);并查看该变量中的实际内容。我猜这是一个字符串。
  • 你输出 $cost_ss 就像一个字符串,虽然它是一个数组......如果你做 echo $array;你会得到字符串“数组”。这就是这里发生的事情。请使用序列化($cost_ss),然后对您的分解数据进行反序列化($data[2])。
  • 这是我测试过的,但没有运气。 $promo=explode("|",$_POST['user_rate']); foreach(unserialize($promo[2]) as $key=&gt;$val){ echo "$key=$val&lt;br /&gt;"; }

标签: php arrays explode


【解决方案1】:

这可能是一个错误$user_rate=$_POST['user_rate'];//15000|ss|Array

您可以将serialize / unserialize 用于数组

【讨论】:

    【解决方案2】:

    您可以在传递数组参数之前serialize。然后在第二页unserialize他们。

    $rate = serialize($rate);
    

    在您通过循环运行之前的第二页:

    $rate = unserialize($rate);
    

    【讨论】:

      【解决方案3】:

      您可以将页面上的值编码为

      implode("|", array($total, $promo, implode(",",$rate));
      

      然后用它解码

      list($total, $promo, $rates) = explode("|", $_POST["user_rate"]);
      $rates = explode(",", $rates);
      

      【讨论】:

      • 我无法更改输入值的格式:&lt;input type="hidden" name="user_rate" value="$ss_total|ss|$cost_ss" /&gt;,因为我需要它用于以后的 javascript 提取字符串。
      【解决方案4】:

      使用序列化绝对是让它工作的关键,但 base64_encode() 是理想的方法来减少混淆。当您只使用序列化时,您会得到分号、逗号、双引号、单引号和其他几个字符,当您将它们传递给重新组合它的脚本时可能会导致问题。

      例如, 在序列化一个数组之后,你会得到这个,就像 Sidux 指出的那样

      a:3:{i:0;s:4:"toto";i:1;s:4:"titi";i:2;a:2:{i:0;s:4:"coco";i:1;s:4:"cici";}}
      

      当您将 base64_encode 添加到组合中时,您将获得更容易使用的值。

      YTozOntpOjA7czo0OiJ0b3RvIjtpOjE7czo0OiJ0aXRpIjtpOjI7YToyOntpOjA7czo0OiJjb2NvIjtpOjE7czo0OiJjaWNpIjt9fQ==
      

      有了这个,您可以轻松地发送/接收您保存的数组,而无需任何修剪、添加斜线等。

      假设您以这种方式发送数据,您的新代码将如下所示

      $user_rate=$_POST['user_rate'];//15000|ss|Array
      list($total,$promo,$rate)=explode("|",$user_rate);
      $rate = unserialize( base64_decode($rate) );
      

      现在,$rate 是一个函数数组

      【讨论】:

      • 赞恩,我试过了,但还是不行。我想知道为什么我看不到“$rate”中的任何内容???
      • 至少在将 $rate 放入 foreach 时应该会收到一个错误,因为它需要一个数组。如果你什么也没得到,这意味着你要么将错误设置为不显示,要么 $rate 实际上是一个空白数组。
      • 赞恩,在发送数组之前。我尝试“foreach”它,它正确显示了每个速率。
      • 这就是我尝试的方式:foreach($cost_ss as $key=&gt;$val){echo "$key=$val,";} 它显示:0=2400,1=2400,2=2400,3=2400,4=2400,5=2400,6=2400,7=2400,8=2400,9=2400,10=2400,11=2400,12=2400,13=2400,
      • 您能否提供用于将数据发送到其他脚本的实际代码。是阿贾克斯吗?你要提交表格吗?换句话说,你是如何发布数据的?
      【解决方案5】:

      好的,很多答案,但没有运气......我会再试一次:

      在提交表单之前,您有一个数组 $rate:

      foreach($rate as $val){
         echo "$val<br>";
      }
      

      并且您想添加 $ss_total 和字符串“ss”并提交它 所以你需要:

      $newarray = array('rate'=>$rate, 'type'=>'ss', 'ss_total'=>$ss_total); 
      // now you have a 2-dimensional array ($newarray)
      
      // the next step is to prepare it for form-submitting (serialize and base64_encode):
      $stringvalue = base64_encode(serialize($newarray));    
      
      // ok, now you are able to submit it as radio-field-value:
      echo '<input type="radio" name="user_rate" id="promo_3" value="'.$stringvalue.'" />';
      

      提交表单后,您会在 $_POST['user_rate'] 中获得一个序列化和编码的字符串,如果您想查看它的外观,可以执行回显。

      现在你需要base64_decode和反序列化:

      $arr = unserialize(base64_decode($_POST['user_rate']));
      

      您现在可以完全访问您的阵列:

      echo $arr['type']."<br />";
      
      echo $arr['ss_total']."<br />";
      echo $arr['rate']['index_of_rate']; // i dont know the keys of rate array...
      

      在 javascript 中访问 $arr:

      echo "<script>";
      echo "var jsarr = ".json_encode($arr).";\n";
      echo "alert(jsarr.ss_total);\n";
      echo "</script>";
      

      我希望你现在明白了。

      【讨论】:

      • 好的,我明白了...它有效,但您的 user_rate 本身似乎不正确。字符串数组不是你想要的。因此,您需要在提交后期数据之前提前一步修复它。
      • 史蒂文,我尝试使用“foreach”在发送之前提取数组,它可以工作。有什么想法吗?
      • 是的,但我们需要将此数组转换为以下字符串的代码:15000|ss|Array。我认为你应该改用序列化的东西。
      • 我已经更新了发送变量的代码。请重新检查。
      • 感谢您的尝试,但“值”的格式无法更改,因为我需要它用于以后的 javascript。 $(document).ready(function(){ $("input[type=radio][name=promo_code]").click(function(){ var arr = this.value.split('|'); $("#total").val(arr[0]); $("#promo_type").val(arr[1]); }); });
      【解决方案6】:

      您好,我认为我理解您的问题,当您从字符串传递和数组时,尝试“序列化”它并在另一页中“反序列化”它,例如:

      $array = serialize(array('toto', 'titi', array('coco', 'cici')));
      

      会给你这样的东西

      a:3:{i:0;s:4:"toto";i:1;s:4:"titi";i:2;a:2:{i:0;s:4:"coco";i:1;s:4:"cici";}}

      如果你使用unserialize($array);,它会返回你的数组

      【讨论】:

      • Sidux,你的意思是我需要将发送数组的方式改写成:
      • 可以这样使用也可以ajax发送,还有json_encode和json_decode
      • Sidux,我无法更改此输入的值格式。因为我仍然需要它来提取页面上的 javascript。
      • 您仍然可以创建其他隐藏输入,或使用 ajax
      • 是的,感谢您的帮助。我重新设计了发送值的方式。现在问题解决了!
      猜你喜欢
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多