簡體   English   中英

如何內爆多維數組?

[英]How to implode a multi-dimensional array?

我有一個數組的數組,如:

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

現在,我想讓這個數組內爆,使其返回如下內容:

  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>

選項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)"]

這樣Regex可以將'COTV_PREMIUM(2200)'變為' COTV_PREMIUM(2200)<br>' 這只是一種更改方法,而不必通過某種邏輯或某種方法浸入陣列中。 我們對數組進行了以下修改:

["1."," COTV_LITE(1800)<br>","2."," COTV_PREMIUM(2200)<br>"]

然后進行爆破,我們再次將其壓平成一個字符串:

 "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文檔頁面。

干杯!

嘗試這個

$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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM