将PHP数组分解为单个值,然后循环输出到变量

12

我想要拆分的字符串是$item['category_names'],例如 包含 Hair, Fashion, News

目前我有以下代码:

$cats = explode(", ", $item['category_names']);
foreach($cats as $cat) {
    $categories = "<category>" . $cat . "</category>\n";
}

我希望$categories的结果如下所示,以便我稍后可以在其他地方输出它。

<category>Hair</category>\n
<category>Fashion</category>\n
<category>News</category>\n

我不确定我是否采取了正确的方式?


3
它有效吗?那是一个相当不错的烟雾测试。如果你做 $categories .= ,它至少会做出你期望的事情。 - AD7six
3
$categories .= // 这里是字符串连接操作缺失。 - djot
你试过这段代码了吗?我认为应该可以工作。 - Bono
3
我会在逗号,处分割字符串并修整结果,而不是在逗号和空格, 处进行分割。 - Nanne
1
也许你会对使用simpleXML对象感兴趣。它是创建XML文件的一种相当简单和稳定的方式。 - Elias Van Ootegem
5个回答

31

在你的代码中,每次迭代都会覆盖 $categories 变量。正确的代码应该是:

$categories = '';
$cats = explode(",", $item['category_names']);
foreach($cats as $cat) {
    $cat = trim($cat);
    $categories .= "<category>" . $cat . "</category>\n";
}

更新:如@Nanne所建议的,只在','上进行explode操作


@AD7six 没有人说这是唯一的解决方案,它实际上是 OP 代码的修复版本;所以是的,它是 OP 实现的正确版本。 - Maxim Krizhanovsky
除了“我的代码有什么问题”之外,没有被问到的问题。 - AD7six

2

@Pierre.Vriens 你想要什么?能否请你解释一下? - Divya Sekar
1
仅发布代码而不解释其含义被认为是低质量的。您还应该解释为什么/如何您发布的代码实际上回答了所提出的问题。例如:“代码中的某个部分(如问题中所包含的)存在错误。即这个和那个是错的。相反,它应该像这样进行更正...这实际上解决了您的错误,因为...."。PS:“阅读源代码”也不是高质量的解释。 - Pierre.Vriens

2

不使用for循环

$item['category_names'] = "Hair,   Fashion,   News";
$categories = "<category>".
        implode("</category>\n<category>", 
        array_map('trim', explode(",", $item['category_names']))) . 
        "</category>\n";
echo $categories;

这并没有简化任何东西,而 array_map('trim', $cats) 比使用 array_walk 和创建函数要简单(且高效)。 - AD7six
array_map 就是我之前在找的东西!谢谢。 - Aaron W.
更好的做法是:将代码格式化以适应窗口大小(或不要在一行上使用多个PHP函数),这样可以使代码更易于阅读。 - AD7six

1

如果您使用这个:

$cats = explode(", ", $item['category_names']);
foreach($cats as $cat) {
$categories = "<category>" . $cat . "</category>\n";
}

$categories字符串每次都被覆盖,所以“hair”和“fashion”会丢失。

但是,如果您在for循环的等号前面添加一个点,就像这样:

$cats = explode(", ", $item['category_names']);
foreach($cats as $cat) {
$categories .= "<category>" . $cat . "</category>\n";
}

$catergories字符串将包含所有三个值:)


0

你代码中的错误是这个:

$categories = "<category>" . $cat . "</category>\n";

您正在每次迭代中覆盖$categories,应该是:

$categories .= "<category>" . $cat . "</category>\n";

我不确定我是否在正确的方向上?

查找和替换并不是explode的用途。如果你只想纠正代码错误-请参见上文。

这样更有效率:

$categories = "<category>" .
    str_replace(', ', "</category>\n<category>", $input) . 
    "</category>\n";

这也包括可变的空格:

$categories = "<category>" . 
    preg_replace('@\s*,\s*@', "</category>\n<category>", $input) . 
    "</category>\n";

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