php为什么不爆炸提取数组值

时间:2018-08-09 02:35:51

标签: php arrays query-string explode array-key

我有一些以=分隔的字符串形式存储的日期值(每个日期值后带有&符号)。

我的$_POST['dates']字符串如下:

23.08.18=&22.08.18=&21.08.18=

在将以下日期插入数据库表之前,我正在尝试以下PHP代码提取日期。该代码目前无法正常工作。

foreach(explode('&', $_POST['dates']) as $value)  
{
    $value1 = explode('=', $value);
    foreach ($value1 as $x) {
    }
}

如何隔离日期值?

2 个答案:

答案 0 :(得分:3)

您可能正在寻找的功能是parse_str()。您有一个带键但没有值的有效查询字符串(well, kind of),因此只需要解析它并隔离键(日期)。不幸的是,解析器将您的点转换为下划线。

代码:(Demo

$string = '23.08.18=&22.08.18=&21.08.18=';
parse_str($string, $out);
var_export(array_keys($out));

输出:

array (
  0 => '23_08_18',
  1 => '22_08_18',
  2 => '21_08_18',
)

当然,您可以使用str_replace()来修复修改后的日期值。 See this demo


或者,如果您想忽略parse_str(),则可以只使用一个正则表达式调用来将=上的字符串除以可选的&

代码:(Demo

$string = '23.08.18=&22.08.18=&21.08.18=';
var_export(preg_split('~=&?~', $string, -1, PREG_SPLIT_NO_EMPTY));

输出:

array (
  0 => '23.08.18',
  1 => '22.08.18',
  2 => '21.08.18',
)

或者没有正则表达式,只需修剪最后一个=并在=&上爆炸:(Demo

$string = '23.08.18=&22.08.18=&21.08.18=';
var_export(explode('=&', rtrim($string, '=')));
// same output as preg_split()

答案 1 :(得分:0)

<?php

$data = '23.08.18=&22.08.18=&21.08.18=';

//$delimiters has to be array
//$string has to be array

function multiexplode ($delimiters,$string) {

 $ary = explode($delimiters[0],$string);
 array_shift($delimiters);
 if($delimiters != NULL) {
    foreach($ary as $key => $val) {
        $ary[$key] = multiexplode($delimiters, $val);
    }
 }
 return  $ary;
}

$exploded = multiexplode(array("=","&"),$data);

var_dump($exploded);

结果应为:

array (size=3)
  0 => string '23.08.18' (length=8)
  2 => string '22.08.18' (length=8)
  4 => string '21.08.18' (length=8)

我们需要使用array_filter

http://php.net/manual/en/function.explode.php

[EDIT] mickmackusa的答案是将url参数解析为变量的正确工具。