Skip to content

feat: zip と zip_with を追加する - #83

Open
Javakky wants to merge 2 commits into
masterfrom
javakky/zip
Open

feat: zip と zip_with を追加する#83
Javakky wants to merge 2 commits into
masterfrom
javakky/zip

Conversation

@Javakky

@Javakky Javakky commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

概要(What / Why)

2 つの配列を反復順序で組み合わせる zip と、ペアに関数を適用する zip_with を追加します。

変更点

  • src/zip.phplist<array{0: L, 1: R}> または左のキーを維持した assoc を返す。長さは min(count($left), count($right))
  • src/zip_with.php — 同じ組み合わせ規則で callback を適用
  • tests/ZipTest.php / tests/ZipWithTest.php
  • composer.jsonautoload.files に 2 件追加

動作確認

  • 手動:
    • zip([1, 2, 3], ['a', 'b'])[[1, 'a'], [2, 'b']]
    • zip(['x' => 1, 'y' => 2], [10, 20])['x' => [1, 10], 'y' => [2, 20]] (左が assoc なので AUTO で キー維持)
    • 同じ入力に Mode::MODE_LIST[[1, 10], [2, 20]]
  • 自動:
    • vendor/bin/php-cs-fixer fix --dry-run --diff / vendor/bin/phpstan analyse -c phpstan.neon / vendor/bin/phpunit tests
    • 結果:OK (137 tests, 144 assertions) / PHPStan level 10 [OK] No errors / CS Fixer Fixed 0 of 35 files

補足(任意)

Mode の扱い

当初は「キーを一切使わない」仕様で Mode を省いていましたが、新規関数には Mode を持たせる方針に合わせて追加しました。

  • MODE_LIST: 左右のキーを無視して 0 始まり連番の list
  • MODE_ASSOC: 左のキーを維持。右のキーは使わない (右は反復順のみ)
  • MODE_AUTO: の形状で判定 (Mode::check_mode($mode, $left))

右のキーは mode によらず一切使いません。左右で役割が非対称なので phpdoc に明記しています。

この変更で MODE_AUTO の既定が「左の形状で判定」になったため、assoc 同士を渡していた既存テストは「MODE_LIST を明示すればキーが無視される」形に書き換えました (削除ではなく改名 + 明示指定)。

zip_with は独立実装です

zip に委譲せず for ループで直接 callback に渡しています。zip と同じループ構造にして姉妹関数間の対称性を取り、中間のペア配列の生成も無くしています。

その他

  • array_values() の結果は $leftValues / $rightValues という別変数に受けています (引数への再代入だと「入力を破壊しない」ことの確認に一手間かかるため)
  • 3 引数以上の可変長版は作っていません
  • @phpstan-param の条件型は付けていません (「assoc 入力 + MODE_LIST」が型エラーになるため。slice.php / map.php / intersect.php と同じ形)

Closes #68
Closes #69

🤖 Generated with Claude Code

Javakky added 2 commits July 27, 2026 16:27
左右の配列を反復順序で組み合わせ、ペアの配列を返す zip 関数を追加する。右のキーは一切使用せず反復順序のみでペアにする。

Mode で戻り値のキーの扱いを切り替える。MODE_ASSOC は左のキーを維持し、MODE_LIST は左右のキーを無視して list を返す。MODE_AUTO は左の形状で判定する。

Closes #68
zip と同じ組み合わせ規則で左右の配列からペアを作り、各ペアに callback を適用した結果を返す zip_with 関数を追加する。中間のペア配列を作らない独立実装。

Mode で戻り値のキーの扱いを切り替える。MODE_ASSOC は左のキーを維持し、MODE_LIST は左右のキーを無視して list を返す。MODE_AUTO は左の形状で判定する。

Closes #69
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.

feat: zip_with を追加する feat: zip を追加する

1 participant