从循环中生成的字符串中删除最后一个字符
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()
行。以上是关于从循环中生成的字符串中删除最后一个字符的主要内容,如果未能解决你的问题,请参考以下文章