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;

查看演示:https://eval.in/871705

编辑: 根据 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.")";

运行 片段:https://ideone.com/EXAPOt

由于字符串接近 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);

https://3v4l.org/Yqrbe

编辑;如果您需要您命名为预期结果的字符串,请使用:

$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).')';