如何在将字符串多次拆分后将字符串转换为有效的 JSON?

3
我正在尝试对一个字符串进行多次分割,并将结果转换为有效的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个回答

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);

0

由于第二个 explode 函数返回一个形如 "KEY=VALUE" 的键值对,第三个 explode 函数已经可以直接返回 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"}]


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接