如何在多次爆炸字符串后将字符串转换为有效的json

时间:2019-05-03 20:21:26

标签: php json

一次试图将字符串爆炸,然后将结果转换为有效的json,我无法弄清楚方法

我试图爆炸并在每次爆炸中进行foreach,但对我没有任何作用

$str='ID=62981155;IT=OV80419674-62981155_1_3;OD=15.4;|ID=62981157;IT=OV80419674-62981157_1_3;OD=3.1;|ID=62981159;IT=OV80419674-62981159_1_3;OD=8.13;|';


$array = explode(';|',$str);

foreach($array as $key => $val) 
{
  $v = explode(";",$val);
  foreach($v as $v1)
  {
    $v2= explode("=",$v1);
    foreach($v2 as $k => $s)
    {
    $u[] = $s;  
    }


  }
}

echo json_encode($u);

我现在得到的结果是: [“ ID”,“ 62981155”,“ IT”,“ OV80419674-62981155_1_3”,“ OD”,“ 15.4”,“ ID”,“ 62981157”,“ IT”,“ OV80419674-62981157_1_3”,“ OD”,“ 3。“,” ID“,” 62981159“,” IT“,” OV80419674-62981159_1_3“,” OD“,” 8.13“,”“]

预期结果是: [{“ ID”:62981155,“ IT”:“ OV80419674-62981155_1_3”,“ OD”:15.4},{“ ID”:62981157,“ IT”:“ OV80419674-62981157_1_3”,“ OD”:3.1},{ “ ID”:62981159,“ IT”:“ OV80419674-62981159_1_3”,“ OD”:8.13}]

3 个答案:

答案 0 :(得分:2)

我将数据分为两个级别,$out是整体内容,$u是每个单独的详细信息集(在每个循环中重置)。

请注意,在内部循环中,您用=对其进行了拆分,它将返回一个键和一个值。这用于设置关联数组,而不仅仅是将每个值添加到数组中。

$array = explode(';|',$str);
$array = array_filter($array);
$out = [];
foreach($array as $key => $val)
{
    $u = [];
    $v = explode(";",$val);
    foreach($v as $v1)
    {
        list($key, $value) = explode("=",$v1);
        $u[$key] = $value;
    }
    $out[] = $u;
}

echo json_encode($out);

答案 1 :(得分:0)

因为第二个爆炸为您提供了“ KEY = VALUE”之类的对,所以第三个爆炸已经为您提供了所需的条件:KEY和VALUE。无需循环运行,可以使用list一次提取两个值

<?php

$str='ID=62981155;IT=OV80419674-62981155_1_3;OD=15.4;|ID=62981157;IT=OV80419674-62981157_1_3;OD=3.1;|ID=62981159;IT=OV80419674-62981159_1_3;OD=8.13;|';

$array = explode(';|', $str);

$u = [];
foreach($array as $key => $val) 
{
  if (empty($val)) {
    continue;
  }

  $tmp = [];
  foreach(explode(";", $val) as $v1)
  {
    list($k, $s) = explode("=", $v1);
    $tmp[$k] = $s; 
  } 
  $u[] = $tmp;
}

echo json_encode($u);

此打印

  

[{“ ID”:“ 62981155”,“ IT”:“ OV80419674-62981155_1_3”,“ OD”:“ 15.4”},{“ ID”:“ 62981157”,“ IT”:“ OV80419674-62981157_1_3” ,“ OD”:“ 3.1”},{“ ID”:“ 62981159”,“ IT”:“ OV80419674-62981159_1_3”,“ OD”:“ 8.13”}]

答案 2 :(得分:0)

您可以使用正则表达式解析字符串,然后循环匹配。
在循环中,我寻找|作为第一个字符,以确定何时移至下一组。

preg_match_all("/(.*?)\=(.*?);/", $str, $match);
//var_dump($match);
$i = 0;
foreach($match[1] as $key => $m){
    if($m[0] == "|"){
        $i++;
        $u[$i][substr($m,1)] = $match[2][$key];
    }else{
        $u[$i][$m] = $match[2][$key];
    }
}
echo json_encode($u);

https://3v4l.org/S8hKW