我有一个数组,如:
$array = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]]
现在,我想内爆该数组,使其返回如下内容:
我该如何实现?仅调用implode()
函数不起作用:
implode ('<br>', $array);
答案 0 :(得分:5)
您可以调用array_map()
插入嵌套数组:
echo implode('<br>', array_map(function($a) { return implode(' ', $a); }, $array));
输出:
1. COTV_LITE(1800)<br>2. COTV_PREMIUM(2200)
答案 1 :(得分:2)
您可以在PHP> = 5.6中使用变长参数variadic
选项1
$items = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]];
echo implode(' ',array_merge(...$items));
输出
1. COTV_LITE(1800) 2. COTV_PREMIUM(2200)
这更像是下一个选项的precursor
。
选项2
如果您想获得更多创意,也可以使用preg_replace
:
$items = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]];
$replace = [
'/^(\d+\.)$/' => '<li>\1 ',
'/^(\w+\(\d+\))$/' => '\1</li>'
];
echo '<ul>'.implode(preg_replace(array_keys($replace),$replace,array_merge(...$items))).'</ul>';
输出
<ul><li>1. COTV_LITE(1800)</li><li>2. COTV_PREMIUM(2200)</li></ul>
选项3
最后使用ol
排序列表,该列表为您提供数字。在这种情况下,我们只需要数组中的第二项(索引1):
$items = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]];
echo '<ol><li>'.implode('</li><li>',array_column($items,1)).'</li></ol>';
输出
<ol><li>COTV_LITE(1800)</li><li>COTV_PREMIUM(2200)</li></ol>
我个人将其放在ol
中,这样您就不必担心数字的顺序,可以让HTML + CSS处理它们。同样,这可能是最简单,最语义上正确的方法,但是我不知道数组中的编号是否具有任何特殊含义。
无论如何,我绝对可以将其放入列表中以呈现为HTML。稍后,这将为您提供更多样式设置选项。
更新
想使用选项1。但是如何使用
将每个选项放在不同的行上<br>
那个将<br>
放在每个数组元素之间:
echo implode('<br>',array_merge(...$items));
输出
1.<br>COTV_LITE(1800)<br>2.<br>COTV_PREMIUM(2200)
要轻松解决此问题(同时保持array_merge)的唯一方法是使用preg_replace,这是第二个方法。因此,我将其称为:
选项1.2
$items = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]];
echo implode(preg_replace('/^(\w+\(\d+\))$/',' \1<br>',array_merge(...$items)));
输出
1. COTV_LITE(1800)<br>2. COTV_PREMIUM(2200)<br>
基本上,在合并它们之后,无法确定最终项目在哪里。该操作有效地使数组变平,并为我们提供了以下内容:
["1.","COTV_LITE(1800)","2.","COTV_PREMIUM(2200)"]
这样正则表达式将'COTV_PREMIUM(2200)'
变成' COTV_PREMIUM(2200)<br>'
。这只是一种更改方法,而不必通过某种逻辑或某种方法浸入阵列中。我们对数组进行了以下修改:
["1."," COTV_LITE(1800)<br>","2."," COTV_PREMIUM(2200)<br>"]
然后使用implode将其再次展平为一个字符串:
"1. COTV_LITE(1800)<br>2. COTV_PREMIUM(2200)<br>"
正则表达式^(\w+\(\d+\))$
^
-匹配字符串的开头(...)
-捕获组1
\w+
-匹配任何一个或多个有效字符a-zA-Z0-9_
,例如。 COTV_PREMIUM
\(
-从字面上匹配(
\d+
-匹配一个或多个数字0-9
,例如2200
\)
-从字面上匹配)
$
-匹配字符串的结尾因此,这与数组中第二个(或什至)项的模式匹配,然后我们将其替换为:
替换' \1<br>'
{space}
-添加领先空间\1
-捕获组1的值(从上方开始)<br>
-附加换行符希望如此。只要他们符合该模式,这应该起作用。显然,我们可以调整模式,但是由于样本量很小,我很难知道会有什么变化。
例如(.+\))$
这样简单的事情就可以工作TestIt。这只是寻找结尾的)
。我们只需要somethng即可捕获所有偶数,而不会匹配奇数。正则表达式在您看到它们的前几次可能会非常令人困惑,但是它们非常强大。
PS -我为函数名称添加了一些链接,这些链接进入了它们的PHP文档页面。
干杯!
答案 2 :(得分:0)
尝试一下
$items = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]];
$imploded = [];
foreach($items as $item) {
$item_entry = implode(' ', $item);
echo $item_entry . '<br/>'; // display items
$imploded[] = $item_entry;
}
// your desired result is in $imploded variable for further use