代码段:
$temp = array();
foreach ($data as $key => $value) {
// This line varies, from HTML to URLs, to anything in between
array_push($temp, "<b>$key:</b> $value");
}
$request = implode('<br/>', $temp); // Glue also varies depending on needs
unset($temp);
这是逃离通常的$string .= 'blah<br/>'
。别管rtrim
。
有人能向我展示一种更好的方法来实现上述目标,而不使用临时数组,也可能不使用循环吗?没有在函数中使用以上代码的额外积分,不过lambda是可以接受的。
附言:在写这个问题的时候,我发现了一个很棒的http_build_query()
。一个倒下,一个倒下。
编辑:
结果应该是什么样子:
<b>Title: </b> Value</br>
<b>Title2: </b> Value2</br>
<b>Title3: </b> Value3
或者使用不同的设置(不需要,但显示可能性):
key=value&key2=value2&key3=value3
我正在努力改进我的代码,我到处都使用上面的代码片段。
我的答案:有一些方法,但是:
循环&数组是任何程序员最好的朋友。
它们提供了很好的可读性和可重用性,通常被认为是执行几乎相同操作的正确方式。
您也可以查看array_map
或array_walk
。代码较少,但无论如何它都是一个循环。
array_walk($data, function($value, $key){
$temp[] = "<b>{$key}:</b> {$value}" ; //Shorthand for array_push is $arr[] = $value ;
}) ;
我想这是一种方式;yay表示"一行":
$data = ...;
echo join("'n", array_map(function($key) use ($data) {
return sprintf('<b>%s:</b> %s',
htmlspecialchars($key, ENT_QUOTES, 'UTF-8'),
htmlspecialchars($data[$key], ENT_QUOTES, 'UTF-8')
);
}, array_keys($data)));
基本上,您使用一个绑定原始数组的闭包来映射键,这样您就可以在每次调用中访问键和值。
我想你会更喜欢你的解决方案:
$data = range('a', 'e'); // some data
$request = ''; // empty string
array_map(function($value, $key)use(&$request, $data){
static $i = 1;
if($i == count($data)){
$request .= "<b>$key:</b> $value";
}else{
$request .= "<b>$key:</b> $value<br/>";
}
$i++;
}, $data, array_keys($data));
echo $request;
在线演示
一个有循环但没有$temp数组的解决方案:
$data = range('a', 'e'); // some data
$request = ""; // empty string
foreach ($data as $key => $value) {
$request .= "<b>$key:</b> $value<br/>"; // add to string
}
$request = substr($request,0,-5); // remove last <br/>
echo $request; //output