将1维字符串数组转换为锚超链接,通过将字符串应用于<a>标记的href和文本

12
我想用类似的东西来包装数组的所有元素,但我不想要很多行或foreach循环。
$links = array('london','new york','paris');

结果应该是

<a href="#london">london</a>
<a href="#new york">new york</a>
<a href="#paris">paris</a>

2
那么,在排除了规范和明智的方法之后,你还尝试了什么? - Lightness Races in Orbit
我很熟悉foreach循环,只是想看看它是否可行。 - Val
为什么没有foreach循环?哦,你刚好在我发帖的时候回答了! - Ryan
5个回答

34

那么 array_map 怎么样呢?

$links   = array('london', 'new york', 'paris');
$wrapped = array_map(
   function ($el) {
      return "<a href=\"#{$el}\">{$el}</a>";
   },
   $links
);

演示(点击源代码)

如果你没有 PHP > 5.3,你就不能使用 lambda 函数,所以你需要像这样做:

function wrap_those_links($el)  { 
      return "<a href=\"#{$el}\">{$el}</a>"; 
}

$links   = array('london', 'new york', 'paris');
$wrapped = array_map('wrap_those_links', $links);

这里是适用于PHP 5.2的演示(再次点击Source)


解析错误:语法错误,意外的 T_FUNCTION,期望 ')' 在...第183行上,引发了一个错误,但这很酷 :) - Val
你不能运行PHP 5.3.0 :) - 这很容易解决,我马上更新我的答案。 - nickb
你的意思是“PHP版本低于5.3吗?” - Mike Causer
链接已失效。 - Zakaria Acharki

7
尝试使用以下代码:join('\n', array_map(function($a) { return "<a href=\"#$a\",>$a<\\a>";}, $links));


该代码的功能是将一个包含链接的数组转换为HTML格式的链接列表。

2
或者是因为他没有使用命名函数"implode",而是使用了别名"join",并且没有以易于阅读的方式格式化答案,也没有提供关于建议限制的说明(PHP 5 >= 5.3)。当涉及到自我文档化时,implode要更加隐式。 - SEoF
我认为这个答案不太正确,应该使用双引号而不是单引号,并且使用正斜杠而不是反斜杠,正确的写法应该是:join("\n", array_map(function($a) { return "<a href=\"#$a\",>$a</a>";}, $links)); - superUntitled

1

在现代的PHP版本中,可以缩短如下。

$wrapper = static fn (string $link): string => \sprintf('<a href="#%1$s">%1$s</a>', $link);
$result = \array_map($wrapper, $links);

0

可重复使用的函数。

function array_wrap_template($array, $template, $rep="{{el}}")
{
    return array_map(function($el)use($template, $rep){
        return str_replace($rep, $el, $template);
    }, array_values($array));
}

$links = array('london','new york','paris');
$wrapped = array_wrap_template($links, "<a href=\"#{{el}}\">{{el}}</a>");


这个答案缺少教育性的解释。 - mickmackusa

0

还有一种尚未提到的技术是使用preg_replace(),它可以愉快地迭代字符串数组,尽管显然这不是实际需要正则表达式模式的任务。(演示

$links = array('london','new york','paris');
var_export(
    preg_replace('/.+/', '<a href="#$0">$0</a>', $links)
);

否则,您可以采取额外的步骤,通过对作为“href”值使用的城市字符串调用urlencode()来生成编码的URL。
var_export(
    array_map(
        fn($city) => sprintf('<a href="#%s">%s</a>', urlencode($city), $city),
        $links
    )
);

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