通过将字符串应用为<a>的href和text,将字符串数组转换为锚超链接.标签


Convert 1d array of strings into anchor hyperlinks by applying the strings as the href and text of <a> tags

我想把数组中的所有元素都包装成这样但是我不想要很多行或者foreach循环

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

结果应该是

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

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)

尝试join(''n', array_map(function($a) { return "<a href='"#$a'",>$a<''a>";}, $links));

在现代PHP版本中可以缩短如下:

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

可重用的功能。

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>");

还没有提到的另一种技术是使用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
    )
);