[英]How to implode a multi-dimensional array?
我有一個數組的數組,如:
$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>
選項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.