从循环中生成的字符串中删除最后一个字符

Posted

技术标签:

【中文标题】从循环中生成的字符串中删除最后一个字符【英文标题】: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”代替。让事情更容易知道最后一个。 看看这个问题***.com/questions/1070244/…。但是我认为使用这样的 foreach 仍然很尴尬。 【参考方案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() 行。

以上是关于从循环中生成的字符串中删除最后一个字符的主要内容,如果未能解决你的问题,请参考以下文章

从图像源中删除最后一个字符

请从键盘输入10个数据 ,每轮循环找到数组中最小的那个删除,数组最后只剩一个?

从字符串中删除最后一个字符

从 C++ 字符串中删除最后一个字符

如何从字符串中删除最后一个字符

从字符串中删除最后一个字符。斯威夫特语言