如何内爆多维数组?

时间:2019-04-10 18:08:58

标签: php arrays implode

我有一个数组,如:

$array = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]]

现在,我想内爆该数组,使其返回如下内容:

  1. COTV_LITE(1800)
  2. COTV_PREMIUM(2200)

我该如何实现?仅调用implode()函数不起作用:

implode ('<br>', $array);

3 个答案:

答案 0 :(得分:5)

您可以调用array_map()插入嵌套数组:

echo implode('<br>', array_map(function($a) { return implode(' ', $a); }, $array));

DEMO

输出:

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>

Sandbox

基本上,在合并它们之后,无法确定最终项目在哪里。该操作有效地使数组变平,并为我们提供了以下内容:

 ["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