【问题标题】:Remove the last charater from string which is generated in loop从循环中生成的字符串中删除最后一个字符
【发布时间】:2018-11-22 17:23:49
【问题描述】:

相信我,我已经尝试了堆栈溢出中的所有内容!

所以,我得到了这个 JSON -

$j={
    "itempicture": [
        {
            "status": "3"
        },
        {
            "ItemCode": "001",
            "ItemImage": "image1",
            "ItemCategory": "shirt",
            "ShowOnPOS": "Yes",
            "LastModifiedOn": "2018-06-02 11:53:57"
        },
        {
            "ItemCode": "002",
            "ItemImage": "image2",
            "ItemCategory": "shirt",
            "ShowOnPOS": "Yes",
            "LastModifiedOn": "2018-06-02 11:53:57"
        }
    ]
}

我正在像这样访问它 -

$jo = json_decode($j);
for($i = 1; $i < count($jo->itempicture); $i++) {
    foreach($jo->itempicture[$i] as $prop=>$val) {
        echo $val.",";
    }
    echo '<br>';
}

我得到了这个输出 -

001,image1,shirt,Yes,2018-06-02 11:53:57,
002,image2,shirt,Yes,2018-06-02 11:53:57,

这个输出的主要问题是最后的“,”。 我无法删除它!

什么都试过了—— 这 - Remove the last character from string

与 substr、rtrim、内爆... 一切!

它不工作!

【问题讨论】:

  • 你在呼应,我猜 rtrim 在这种情况下确实有效,但如果你创建一个变量 $string += $val.",";然后回显 $string;我很确定 rtrim() 会起作用... echo rtrim($string, ',');
  • @Roy 的解决方案的替代方案是在 foreach 循环之后存储在一个变量中,并在 foreach 循环之后使用substr($string, 0, -1); 回显它
  • 那么 foreach 是“for each”,您可以使用“for”代替。让事情更容易知道最后一个。
  • 看看这个问题stackoverflow.com/questions/1070244/…。但是我认为使用这样的 foreach 仍然很尴尬。

标签: php json loops trim character-trimming


【解决方案1】:

你可以这样做

 $jo=json_decode($j);

 for($i=1;$i<count($jo->itempicture);$i++){
 foreach($jo->itempicture[$i] as $prop=>$val){
      if ($value === end($jo->itempicture[$i])) {
        echo $val;
      }
      else {
        echo $val.",";
      }
 }
 echo '<br>';
}

通过比较您当前的迭代是否是循环的结尾,这将阻止写入最后一个“,”

【讨论】:

  • 出现错误 - end() 期望参数 1 为数组,第 17 行给出 null。@Gregoire
  • 有效!感谢@Gregoire 的帮助
【解决方案2】:

解决办法

$j='{"itempicture":[
{
    "status":"3"
},
{
    "ItemCode":"001",
    "ItemImage":"image1",
    "ItemCategory":"shirt",
    "ShowOnPOS":"Yes",
    "LastModifiedOn":"2018-06-02 11:53:57"
},
{
    "ItemCode":"002",
    "ItemImage":"image2",
    "ItemCategory":"shirt",
    "ShowOnPOS":"Yes",
    "LastModifiedOn":"2018-06-02 11:53:57"
}
]
}';
$jo=json_decode($j);
$edata = '';
for($i=1;$i<count($jo->itempicture);$i++){
    $data = '';
    foreach($jo->itempicture[$i] as $prop=>$val){
        $data .= $val.",";
    }
    $edata .= rtrim($data, ",");
    $edata .='<br/>';
}

echo "<pre>";
print_r($edata);
echo "</pre>";

【讨论】:

  • 不仅是一个糟糕的解决方案,而且根本没有任何解释。
  • 工作正常!感谢@Bhumi 的帮助
【解决方案3】:

如果你知道最后一个元素总是LastModifiedOn

$jo=json_decode($j);
 for($i=1;$i<count($jo->itempicture);$i++){
 foreach($jo->itempicture[$i] as $prop=>$val){
    if($prop == "LastModifiedOn")
        echo $val;
    else
        echo $val.",";
 }
 echo '<br>';
}

【讨论】:

  • 这仅适用于特定的 JSON,不适用于其他 JSON。但是感谢@Akshay的想法
【解决方案4】:

使用implode() 的版本,这意味着您必须从 JSON 转换为数组(默认是转换为对象,因此将 true 作为第二个参数添加到 json_decode())。

$j='{"itempicture":[
{
    "status":"3"
},
{
    "ItemCode":"001",
    "ItemImage":"image1",
    "ItemCategory":"shirt",
    "ShowOnPOS":"Yes",
    "LastModifiedOn":"2018-06-02 11:53:57"
},
{
    "ItemCode":"002",
    "ItemImage":"image2",
    "ItemCategory":"shirt",
    "ShowOnPOS":"Yes",
    "LastModifiedOn":"2018-06-02 11:53:57"
}
]
}';
$jo=json_decode($j, true);
array_shift($jo['itempicture']);
$edata = '';
foreach ( $jo['itempicture'] as $item)  {
    $edata .= implode(",", $item).'<br/>';
}
echo "<pre>";
print_r($edata);
echo "</pre>";

打印出来...

<pre>001,image1,shirt,Yes,2018-06-02 11:53:57<br/>
002,image2,shirt,Yes,2018-06-02 11:53:57<br/></pre>

【讨论】:

  • 我认为这是所有解决方案中最好的。除非您有充分的理由将 JSON 解码为对象。 implode 可以满足您的需要,并使代码更简单。
  • 删除“
    ”标签并得到这个错误 - array_shift() 期望参数 1 是数组,在第 15 行给出 null @nigel
  • 您是否在 JSON ($j) 周围添加了单引号,我已将此添加到答案中。
  • 还要确保你有正确的json_decode() 行。
猜你喜欢
  • 2013-02-17
  • 1970-01-01
  • 2019-03-02
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多