我有一个数组数组,如:
$array = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]]
现在,我想破坏这个数组,以便返回如下内容:
我该如何实现这一目标?只调用implode()
函数不起作用:
implode ('<br>', $array);
你可以调用array_map()
来破坏嵌套数组:
echo implode('<br>', array_map(function($a) { return implode(' ', $a); }, $array));
输出:
1. COTV_LITE(1800)<br>2. COTV_PREMIUM(2200)
您可以在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>
2选项
最后使用ol
ordered列表,它为你做数字。在这种情况下,我们只需要数组中的第二项(索引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。这个只是寻找结束)
。我们只需要一些东西来捕捉所有偶数,而不匹配奇数。正则表达式在您看到它们的前几次可能会非常混乱,但它们非常强大。
PS - 我添加了一些函数名称的链接,这些是他们的PHP文档页面。
干杯!
试试这个
$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