かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHP array_reduce を途中で break したい

要件

  • JSON ファイルのキーを. 繋がりにした文字列が渡される
  • キーを辿って最後の値を返す
  • キーを辿って値にたどり着けなかった場合は最後のキーを返す

方針

  1. 渡された文字列を explode で分割して配列にする
  2. 分割した配列を reduce して JSON のキーを辿って最後にたどり着いた値を返す
  3. 途中で値が無くなったら reduce から抜けて配列の最後の値 (最後のキー) を返す

array_reduce を途中で抜ける方法の Tips

JavaScript でもそうですが map や reduce は配列を回しきるまで基本的に途中で抜ける事ができません
今回 PHP では例外を投げそれを try 〜 cache することで reduce から抜けたように扱うことができました!

<?php
$keys = explode('.', $strings);
try {
  $res = array_reduce($keys, function(array $carry, string $key) {
    if ( !isset($carry[$key]) ) {
      throw new \OutOfBoundsException("Invalid key: {$key}");
    }
    return $carry[$key];
  }, $jsonData);
  // $keys の最後の値が JSON の途中の場合はエラーにする
  if ( is_array($res) ) {
    throw new \Exception("Invalid key: '{$key}'");
  }
} catch (\OutOfBoundsException $e) {
  // JSON にキーが無い場合 $keys の最後の値を返す
  $res = end($keys);
}

例外投げて reduce を途中で抜けるのあまりお行儀はよく無さそうだけど、JavaScript でも同じように使えそうな手だな〜と思いました
おわり


[参考]