需求:因為之前的帖子列表,是一行放一個,所以直接一個循環即可。現在新增加了一個模塊,這個模塊的帖子列表樣式是一行放兩個,本來想讓前端做成自適應,這樣就可以共用一個數組list的,但是由於歷史版本是使用的table標簽,所以最后還是需要改下列表的數據結構。
具體問題點:如下截圖,就是對一個二維數組按片段拆分,並且按添加指定后綴進行合並,成一個新數組
會遇到的問題:拆分與合並中,主要是對於二維數組,如果是單數,就會導致后一般(加_s后綴的一段不全),這里對於二維數組如果只有 1個,2個,或是超過2個以上的並且是單數和的,這三種做特殊對待,其他的直接按規則處理。
最后代碼如下:直接傳入需要處理的二維數組,最后方法返回處理后的數組
/** * 將一個二維數組對半切切開拼接成一個新的數組 * 如數組[[1],[2],[3],[4],[5]]對切割成[[1,2],[3.4][5]] * @param [type] $threaddb * @return void */ function splitInHalfArray($threaddb){ $threaddb_new = [];//定義一個,最內層數組收集器 $threaddb_new_web = [];//定義一個,最終數組收集器 $threaddb_new_web_tail = [];//定義一個,$threaddb數組個數超過2的尾巴收集器 $threaddb_count = count($threaddb); switch($threaddb_count){ case 1://帖子只有一個 foreach(current($threaddb) as $key => $value){//格式化二維數組鍵名,去掉第一次鍵名 $threaddb_new[$key] = $value; } $threaddb_new_web[] = $threaddb_new; break; case 2://帖子有二個 $threaddb_new = current($threaddb);//獲取第一個數組,直接追加 //獲取最后一個數組,新增鍵名后綴'_s'后,再次追加 foreach(end($threaddb) as $key => $value){ $threaddb_new[$key.'_s'] = $value; } $threaddb_new_web[0] = $threaddb_new; break; default://帖子有三個(含三)個以上 $n = 0; foreach($threaddb as $key => $value){ $n ++; if($n % 2 != 0){//單數第一個,直接追加 foreach($value as $key_s => $value_s){ $threaddb_new[$key_s] = $value_s; } }else{//雙數第二個,新增鍵名后綴'_s'后,再次追加 foreach($value as $key_s => $value_s){ $threaddb_new[$key_s.'_s'] = $value_s; } } if($n % 2 == 0){//每循環兩次,將拼接的數組,追加到新的數組中 $threaddb_new_web[] = $threaddb_new; }elseif($n == $threaddb_count && $n % 2 != 0){//如果是$threaddb的最后一個數組 並且 $threaddb數組個數是單數 foreach(end($threaddb) as $key => $value){ $threaddb_new_web_tail[$key] = $value; } $threaddb_new_web[] = $threaddb_new_web_tail; } } } return $threaddb_new_web; }
寫在最后,上面數組截圖,就是處理之后的。當然,如果二維數組是單數,就是如下,最后一個只有前半,因為后一般已經沒有數據了。