我正在尝试使用像
php,mysql,css
#php #mysql #css
到目前为止我所拥有的:
$hashTagStr = "php,mysql,css";
$hashTags = explode(",", $hashTagStr);
foreach($hashTags as $k => $v){
$hashTagsStr = '';
$hashTagsStr .= '#'.$v.' ';
}
echo $hashTagsStr;
问题是它只打印
#css
这个怎么样:
$hashTagStr = "php,mysql,css";
$hashTags = explode(",", $hashTagStr);
$hashTagStr = '#' . implode( ' #', $hashTags );
...或:
$hashTagStr = "php,mysql,css";
$hashTagStr = '#' . str_replace( ',', ' #', $hashTagStr );
那是因为每次循环运行时,您都会通过执行以下操作来清除 $hashTagsStr:
$hashTagsStr = '';
更改为:
$hashTagStr = "php,mysql,css";
$hashTags = explode(",", $hashTagStr);
$hashTagsStr = '';
foreach($hashTags as $k => $v){
$hashTagsStr .= '#'.$v.' ';
}
echo $hashTagsStr;
通过引用传递您的值:
$hashTags = array("php","mysql","css");
foreach ( $hashTags as &$v ) $v = "#" . $v;
然后敲定结果:
// #php #mysql #css
echo implode( " ", $hashTags );
演示:http://codepad.org/zbtLF5Pk
让我们检查一下您在做什么:
// You start with a string, all good.
$hashTagStr = "php,mysql,css";
// Blow it apart into an array - awesome!
$hashTags = explode( "," , $hashTagStr );
// Yeah, let's cycle this badboy!
foreach($hashTags as $k => $v) {
// Iteration 1: Yeah, empty strings!
// Iteration 2: Yeah, empty...wait, OMG!
$hashTagsStr = '';
// Concat onto an empty var
$hashTagsStr .= '#'.$v.' ';
}
// Show our final output
echo $hashTagsStr;
看起来像是
array_walk
的工作
$hashTagStr = "php,mysql,css";
$hashTags = explode(",", $hashTagStr);
array_walk($hashTags, function(&$value){ $value = "#" . $value ;} );
var_dump(implode(" ", $hashTags));
输出
string '#php #mysql #css' (length=16)
您应该将
$hashTagsStr = ''
行移到 foreach 循环之外,否则每次都会重置它
您正在循环内定义变量
$hashTagsStr
。
<?php
$hashTagStr = "php,mysql,css";
$hashTags = explode(",", $hashTagStr);
$hashTagsStr = '';
foreach($hashTags as $k => $v){
$hashTagsStr .= '#'.$v.' ';
}
echo $hashTagsStr;
无论如何,我认为这会更简单:
<?php
$hashTagStr = "php,mysql,css";
$hashTagStr = '#' . str_replace(',', ' #', $hashTagStr);
echo $hashTagStr;
在循环的每次迭代期间,您都在做
$hashTagsStr = '';
。这是将变量设置为 ''
,然后附加当前标签。因此,完成后,$hashTagsStr
将仅包含最后一个标签。
此外,循环在这里似乎工作量太大,您可以更轻松地将
,
替换为 #
。无需将其分解为数组,无需循环。试试这个:
$hashTagStr = "php,mysql,css";
$hashTagStr = '#'.str_replace(',', ' #', $hashTagStr);
function prepend( $pre, $array )
{
return array_map(
function($t) use ($pre) { return $pre.$t; }, $array
);
}
字符串中的语义是一个数组。 ➪ 所以最好尽快爆炸,并尽可能长时间地继续使用您的阵列。
闭包和匿名函数如图所示在 PHP 5.4+ 中工作。
请小心实施不会将
#
添加到空数组的解决方案。一个好的通用解决方案也不应该创建不必要的尾随空格。理想情况下,无论分隔值字符如何,强大的通用解决方案都应该有效。
这永远不会生成任何不需要的字符。通过分隔符分割值,使用 substr_replace() 在每个值前面添加
#
,然后用空格重新连接。
代码:(演示)
echo implode(
' ',
substr_replace(
explode(',', $hashTagStr),
'#',
0,
0
)
);