如何破坏多维数组?

问题描述 投票:1回答:3

我有一个数组数组,如:

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

现在,我想破坏这个数组,以便返回如下内容:

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

我该如何实现这一目标?只调用implode()函数不起作用:

implode ('<br>', $array);
php arrays implode
3个回答
5
投票

你可以调用array_map()来破坏嵌套数组:

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

DEMO

输出:

1. COTV_LITE(1800)<br>2. COTV_PREMIUM(2200)

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>

2选项

最后使用olordered列表,它为你做数字。在这种情况下,我们只需要数组中的第二项(索引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。这个只是寻找结束)。我们只需要一些东西来捕捉所有偶数,而不匹配奇数。正则表达式在您看到它们的前几次可能会非常混乱,但它们非常强大。

PS - 我添加了一些函数名称的链接,这些是他们的PHP文档页面。

干杯!


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
© www.soinside.com 2019 - 2024. All rights reserved.