php 多重数组多重爆炸
php multiple array multiple explode
Php代码
<?php
$d1 = "a:1,b:2,c:3,d:4"; //field number variable.. sometimes 4 or 10
$d2 = explode(',', $d1);
foreach ($d2 as $key => $value) {
$arr1 = explode(':',$d2[$key]);
foreach ($arr1 as $key1 => $value1) {
$arr1[] = $key1;
}
echo $arr1[0] . "," . $arr1[1] . ",";
}
?>
结果
a,1,b,2,c,3,d,4,
字段 (a,b,c,d)(字段编号可变..有时是 4 或 10..)
值 (1,2,3,4)
预期结果
Insert into Table1 (a,b,c,d) values (1,2,3,4)
我该怎么做才能得到这个结果? (如果是完整的例子就好了)
感谢大家的回答
您可以使用 preg_split。
$output = preg_split( "/ (,|:) /", $input );
接下来,你可以循环检查一下。
foreach ($output as $value)
{
if(is_number($value))
$keys[] = $value;
else
$values[] = $value;
}
在最近的 PHP 版本中,您可以将 $d2[$key] 上的 explode() 结果解构(您应该改进您的命名,它会有所帮助!)到两个单独的数组中,如下所示:
$keys = $values = [];
foreach (explode(',', $d1) as $parameter)
[$keys[], $values[]] = explode(':', $parameter);
var_dump($keys, $values);
var_dump(array_combine($keys, $values));
之后,您可以简单地将其构建到查询中。但是,您的数据似乎是由用户提供的,因此您应该非常小心这些数据。您似乎几乎要在代码中引入 SQL 注入漏洞。
我建议根据白名单检查 $keys 数组,然后在查询中使用其中任何一个之前正确转义所有 $values。您可以在这里找到一些信息:PDO with INSERT INTO through prepared statements
我知道 preg_split()
会很好地完成任务。但是最后一天,当我遇到类似的问题时,我在 http://php.net/manual/en/function.explode.php#111307
的帮助下完成了这个解决方案
function multiexplode ($delimiters,$string) {
$ready = str_replace($delimiters, $delimiters[0], $string);
$launch = explode($delimiters[0], $ready);
return $launch;
}
$d1 = "a:1,b:2,c:3,d:4";
$result = implode(',',multiexplode(array(",",".","|",":"),$d1));
echo $result;
编辑: 根据 SO
的评论
$d1 = "a:1,b:2,c:3,d:4"; //field number variable.. sometimes 4 or 10
$d2 = explode(',', $d1);
$result = [];
foreach ($d2 as $key => $value) {
list($k,$v) = explode(':',$value);
$result[$k] = $v;
}
print '<pre>';
print_r($result);
print '</pre>';
echo "INSERT INTO table1 (".implode(', ',array_keys($result)). ") VALUES (".implode(', ',array_values($result)). ")";
尝试以下逻辑:
foreach ($d2 as $key => $value) {
$arr1 = explode(':', $value);
if (count($arr1) == 2){
$arr[$arr1[0]] = $arr1[1];
}
}
以逗号分隔获取所有字段和值:
$fields = array_keys($arr);
¢values = array_values($arr);
并在您的查询中使用这些变量:
$fields = implode(",", array_keys($arr));
$values = implode(",", array_values($arr));
$query = "INSERT INTO Table1 (".$fields.") VALUES (".$values.")";
由于字符串接近 json 格式,我认为将其设为真 json 并对其进行解码意味着没有循环或分解是一种有效的解决方案。
$d1 = "a:1,b:2,c:3,d:4";
$d1 = "{\"".str_replace(array(",",":"),array('","','":"'), $d1)."\"}";
$arr = json_decode($d1, true);
$table = array_keys($arr);
$values = array_values($arr);
Var_dump($table);
Var_dump($values);
编辑;如果您需要您命名为预期结果的字符串,请使用:
$str ="Insert into Table1 (". Implode(",", $table) .") values (" . Implode(",", $values).")";
Echo $str;
在下面的代码中使用。
只需稍微更改您的代码即可正常工作。
$d1 = "a:1,b:2,c:3,d:4"; //field number variable.. sometimes 4 or 10
$d2 = explode(',', $d1);
$colums = $values = array();
foreach ($d2 as $key => $value) {
$arr1 = explode(':',$value);
$colums[] = "`".$arr1[0]."`";
$values[] = "'".$arr1[1]."'";
}
$sql = 'insert into `Table1` ('.implode(",",$colums).') values ('.implode(",",$values).')';
Php代码
<?php
$d1 = "a:1,b:2,c:3,d:4"; //field number variable.. sometimes 4 or 10
$d2 = explode(',', $d1);
foreach ($d2 as $key => $value) {
$arr1 = explode(':',$d2[$key]);
foreach ($arr1 as $key1 => $value1) {
$arr1[] = $key1;
}
echo $arr1[0] . "," . $arr1[1] . ",";
}
?>
结果
a,1,b,2,c,3,d,4,
字段 (a,b,c,d)(字段编号可变..有时是 4 或 10..)
值 (1,2,3,4)
预期结果
Insert into Table1 (a,b,c,d) values (1,2,3,4)
我该怎么做才能得到这个结果? (如果是完整的例子就好了)
感谢大家的回答
您可以使用 preg_split。
$output = preg_split( "/ (,|:) /", $input );
接下来,你可以循环检查一下。
foreach ($output as $value)
{
if(is_number($value))
$keys[] = $value;
else
$values[] = $value;
}
在最近的 PHP 版本中,您可以将 $d2[$key] 上的 explode() 结果解构(您应该改进您的命名,它会有所帮助!)到两个单独的数组中,如下所示:
$keys = $values = [];
foreach (explode(',', $d1) as $parameter)
[$keys[], $values[]] = explode(':', $parameter);
var_dump($keys, $values);
var_dump(array_combine($keys, $values));
之后,您可以简单地将其构建到查询中。但是,您的数据似乎是由用户提供的,因此您应该非常小心这些数据。您似乎几乎要在代码中引入 SQL 注入漏洞。
我建议根据白名单检查 $keys 数组,然后在查询中使用其中任何一个之前正确转义所有 $values。您可以在这里找到一些信息:PDO with INSERT INTO through prepared statements
我知道 preg_split()
会很好地完成任务。但是最后一天,当我遇到类似的问题时,我在 http://php.net/manual/en/function.explode.php#111307
function multiexplode ($delimiters,$string) {
$ready = str_replace($delimiters, $delimiters[0], $string);
$launch = explode($delimiters[0], $ready);
return $launch;
}
$d1 = "a:1,b:2,c:3,d:4";
$result = implode(',',multiexplode(array(",",".","|",":"),$d1));
echo $result;
编辑: 根据 SO
的评论$d1 = "a:1,b:2,c:3,d:4"; //field number variable.. sometimes 4 or 10
$d2 = explode(',', $d1);
$result = [];
foreach ($d2 as $key => $value) {
list($k,$v) = explode(':',$value);
$result[$k] = $v;
}
print '<pre>';
print_r($result);
print '</pre>';
echo "INSERT INTO table1 (".implode(', ',array_keys($result)). ") VALUES (".implode(', ',array_values($result)). ")";
尝试以下逻辑:
foreach ($d2 as $key => $value) {
$arr1 = explode(':', $value);
if (count($arr1) == 2){
$arr[$arr1[0]] = $arr1[1];
}
}
以逗号分隔获取所有字段和值:
$fields = array_keys($arr);
¢values = array_values($arr);
并在您的查询中使用这些变量:
$fields = implode(",", array_keys($arr));
$values = implode(",", array_values($arr));
$query = "INSERT INTO Table1 (".$fields.") VALUES (".$values.")";
由于字符串接近 json 格式,我认为将其设为真 json 并对其进行解码意味着没有循环或分解是一种有效的解决方案。
$d1 = "a:1,b:2,c:3,d:4";
$d1 = "{\"".str_replace(array(",",":"),array('","','":"'), $d1)."\"}";
$arr = json_decode($d1, true);
$table = array_keys($arr);
$values = array_values($arr);
Var_dump($table);
Var_dump($values);
编辑;如果您需要您命名为预期结果的字符串,请使用:
$str ="Insert into Table1 (". Implode(",", $table) .") values (" . Implode(",", $values).")";
Echo $str;
在下面的代码中使用。 只需稍微更改您的代码即可正常工作。
$d1 = "a:1,b:2,c:3,d:4"; //field number variable.. sometimes 4 or 10
$d2 = explode(',', $d1);
$colums = $values = array();
foreach ($d2 as $key => $value) {
$arr1 = explode(':',$value);
$colums[] = "`".$arr1[0]."`";
$values[] = "'".$arr1[1]."'";
}
$sql = 'insert into `Table1` ('.implode(",",$colums).') values ('.implode(",",$values).')';