要件
- JSON ファイルのキーを
.
繋がりにした文字列が渡される - キーを辿って最後の値を返す
- キーを辿って値にたどり着けなかった場合は最後のキーを返す
方針
- 渡された文字列を
explode
で分割して配列にする - 分割した配列を reduce して JSON のキーを辿って最後にたどり着いた値を返す
- 途中で値が無くなったら 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 でも同じように使えそうな手だな〜と思いました
おわり
[参考]