Skip to content

feat: chunk_by を追加#75

Open
Javakky wants to merge 1 commit into
masterfrom
javakky/chunk-by
Open

feat: chunk_by を追加#75
Javakky wants to merge 1 commit into
masterfrom
javakky/chunk-by

Conversation

@Javakky

@Javakky Javakky commented May 26, 2026

Copy link
Copy Markdown
Collaborator

概要

連続する要素を callback の戻り値が等しい範囲ごとにまとめた配列の配列を返す chunk_by を追加します。

PHP 標準の array_chunk が指定サイズで等分するのに対し、 本関数は隣接する要素間で callback の結果が変わる位置で chunk を切ります。

Scala の List#groupAdjacent / Haskell の Data.List.groupBy に相当する操作で、 「状態が切り替わる位置でランを区切る」 系の処理が一発で書けるようになります。

Why

社内の dic.pixiv.net で TipTap ノード木の整形処理 (連続する illust 埋め込みを 1 つの block にまとめる等) で必要になり、 Phollection に欠けていたので追加。 既存の group_by (キーごとに非隣接でもまとめる) とは別の用途。

変更点

  • src/chunk_by.php を追加
  • tests/ChunkByTest.php に 7 ケース
    • 空配列
    • 単一要素
    • 全要素同キー
    • 二値での交替
    • 多値での分割
    • chunk 内の順序保証
    • 入力非破壊

動作確認

chunk_by([1, 1, 2, 3, 3, 1], fn (int \$v): int => \$v)
// => [[1, 1], [2], [3, 3], [1]]

chunk_by([1, 2, 'a', 'b', 3], fn (\$v): bool => is_int(\$v))
// => [[1, 2], ['a', 'b'], [3]]

Note

ローカル環境の制約により vendor を install できなかったため、 PHPUnit / PHPStan の確認は CI 側にお願いします。 ロジック自体は社内利用の同等実装でテストが通っていることを確認済みです。

🤖 Generated with Claude Code

連続する要素を callback の戻り値が等しい範囲ごとにまとめた配列の配列を返す。
PHP 標準の array_chunk が指定サイズで等分するのに対し、 本関数は隣接する要素間で
callback の結果が変わる位置で chunk を切る。

例: chunk_by([1, 1, 2, 3, 3, 1], fn (int \$v): int => \$v)
  => [[1, 1], [2], [3, 3], [1]]

Scala の List#groupAdjacent / Haskell の Data.List.groupBy に相当する操作で、
「状態が切り替わる位置でランを区切る」 系の処理が array_chunk_by 一発で書ける。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@Javakky Javakky force-pushed the javakky/chunk-by branch from 8199f12 to d4f50d3 Compare May 26, 2026 07:17
Repository owner deleted a comment from claude Bot May 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant