首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 陣列分組技巧:將扁平陣列按固定大小切割為多維陣列(適用 Smarty/Blade 模板)

     編輯:PHP 相關知識

前言

前端渲染「每行 N 個項目」(如商品網格、圖片牆)時,常需將一維陣列切割為二維陣列:[ [item1..N], [itemN+1..2N], ... ]。本文提供通用 PHP 切割函數、Smarty/Blade 模板渲染範例,並說明邊界情況處理。

核心切割代碼

/**
 * 將一維陣列按固定大小切割為二維陣列
 * @param array  $flat   來源陣列
 * @param int    $chunkSize 每組筆數
 * @return array 二維陣列
 */
function chunk_array(array $flat, int $chunkSize): array {
    if ($chunkSize <= 0) throw new InvalidArgumentException('chunkSize 必須 > 0');
    $result = [];
    $group  = [];
    $i = 0;
    foreach ($flat as $item) {
        $group[] = $item;
        if (++$i === $chunkSize) {
            $result[] = $group;
            $group = [];
            $i = 0;
        }
    }
    if ($group) $result[] = $group; // 餘數組
    return $result;
}

// 使用範例
$arr = [1,2,3,4,5,6,7];
$data = chunk_array($arr, 4);
// 結果:[[1,2,3,4], [5,6,7]]

模板渲染範例

Smarty 模板

<ul>
{foreach from=$data item=group}
    <li>
    {foreach from=$group item=val}
        <a href="#"><img src="{$val.image_url}" alt="{$val.name}"></a>
    {/foreach}
    </li>
{/foreach}
</ul>

Laravel Blade 模板

<ul>
@foreach ($data as $group)
    <li>
    @foreach ($group as $val)
        <a href="#"><img src="{{ $val['image_url'] }}" alt="{{ $val['name'] }}"></a>
    @endforeach
    </li>
@endforeach
</ul>

原生 PHP 模板

<ul>
<?php foreach ($data as $group): ?>
    <li>
    <?php foreach ($group as $val): ?>
        <a href="#"><img src="<?= htmlspecialchars($val['image_url']) ?>" alt="<?= htmlspecialchars($val['name']) ?>"></a>
    <?php endforeach; ?>
    </li>
<?php endforeach; ?>
</ul>

進階變體

1. 保留鍵名的切割

function chunk_array_preserve_keys(array $flat, int $chunkSize): array {
    $result = [];
    $group = [];
    $i = 0;
    foreach ($flat as $k => $v) {
        $group[$k] = $v;
        if (++$i === $chunkSize) {
            $result[] = $group;
            $group = [];
            $i = 0;
        }
    }
    if ($group) $result[] = $group;
    return $result;
}

2. 使用 array_chunk 內建函數(PHP 4.2+)

$data = array_chunk($arr, 4, true); // 第三參數 true 保留鍵名
// 注意:array_chunk 會重新索引數字鍵,關聯鍵需 true 保留

3. 支援分頁的切割(指定頁碼、每頁組數)

function chunk_paginate(array $flat, int $chunkSize, int $page, int $groupsPerPage): array {
    $allGroups = chunk_array($flat, $chunkSize);
    $offset = ($page - 1) * $groupsPerPage;
    return array_slice($allGroups, $offset, $groupsPerPage);
}

常見陷阱與應對

問題原因解決
最後一組筆數不足總筆數非 chunkSize 倍數正常現象,模板需支援可變長度迴圈
鍵名遺失array_chunk 預設重新索引傳第三參數 true 或用自定義函數
記憶體飆升原陣列極大(百萬級)改用 Generator 分塊輸出,或資料庫 LIMIT 分頁
模板報錯「Invalid argument supplied for foreach」$data 為 null 或非陣列函數回傳前確保 `return $result ?: [[]]`

結語

掌握 chunk_array 核心邏輯與 array_chunk 內建函數差異,即可靈活應對各類「固定列數網格」渲染需求。建議封裝為專案通用 Helper 函數,統一參數驗證與邊界處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved