おちゅかれしゃまでしゅー。
初めに、ちょっと方向修正しまちゅ。
えっと、今回紹介しゅるのは再帰をしないやり方でちゅ。
たまたま引っ張り出したコードが、再帰をちゅかっていないコードでちた。
ぽっくんのコードは何度何度もリファクタをちているのでいろんなバージョンがあるのでちゅ。
お見せしゅるのはかなり古いコードでちゅね。
まじゅ、このコードが出来上がった背景を説明するのでちゅが、
これは、ぽっくんが使っている汎用バリデーターの機能の一部なのでちゅ。
ぽっくんが昔やっていた仕事で、こういう要件がお客しゃんから上がってきたのでちゅ。
しょの時の設計者はとにかく「あれも出来ませんこれも出来ません」と言って
お客さんからの要望をかたっぱしから断ってしまう人だったのでちゅよ。
しょれでぽっくんはお客しゃんが可愛そうだったので、
こういう要望を簡単に実現できる、どんな要望が来ても簡単に答える事の出来るバリデーターをちゅくろうと思ったのでちゅね。
ぽっくんが考えた仕様は、
PHP
1$validator = [
2 "hoge" => ["type" => "text", "min" => 0, "max" => 32, "required" => true],
3 , "test_%_%" => ["type" => "text", "min" => 5, "max" => 12, "required" => true],
4];
みたいなバリデーション定義をしゅると、name: test__ について、ルール通りのバリデーションをちてくれるものでちゅ。
プログラムで処理するには、当然こういうリクエストは
PHP
1$_POST = [
2 "test_1_2" => "hoge"
3 , "test_1_2" => "hage"
4 , "test_1_3" => "baka"
5 , "test_4_5_6" => "otankonasu"
6 , "test_4_7" => "kutabare"
7];
こうなってくれていたほうがfoeachで回せて楽ちんでちゅよね。
Array
(
[1] => Array
(
[2] => hage
[3] => baka
)
[4] => Array
(
[5] => Array
(
[6] => otankonasu
)
[7] => kutabare
)
)
だから実装したのでちゅ。
で、これが第2期だったか第3期だったかのコードを切り出したものでちゅ。
(多分、動くでちゅ。)
PHP
1<?php
2function getRequestMultiArray($prefix, $posts)
3{
4 $reqArray = array();
5 foreach ($posts as $key => $req)
6 {
7 if (!preg_match("/\A{$prefix}_(\d+_)*\d+\z/u", $key)){ continue; }
8 $key = str_replace("{$prefix}_", "", $key);
9 $serial = explode("_", $key);
10 $cArray = &$reqArray;
11 for ($i = 0; $i < count($serial); $i++)
12 {
13 if ($i === count($serial) - 1)
14 {
15 $cArray[$serial[$i]] = $req;
16 }
17 else
18 {
19 if (!isset($cArray[$serial[$i]]))
20 {
21 $cArray[$serial[$i]] = array();
22 }
23 }
24 $cArray = &$cArray[$serial[$i]];
25 }
26 unset($cArray);
27 }
28 return $reqArray;
29}
30
31//////////////////////////////////////////////////////////
32
33$posts = [
34 "test_1_2" => "hoge"
35 , "test_1_2" => "hage"
36 , "test_1_3" => "baka"
37 , "test_4_5_6" => "otankonasu"
38 , "test_4_7" => "kutabare"
39];
40$prefix = "test";
41$posts[$prefix] = getRequestMultiArray($prefix, $posts);
42
43print_r($posts[$prefix]);
こんな感じの配列がかえりまちゅ。
Array
(
[1] => Array
(
[2] => hage
[3] => baka
)
[4] => Array
(
[5] => Array
(
[6] => otankonasu
)
[7] => kutabare
)
)
結局ね、プログラムって社会の問題を解決するためにあるのでちゅよね。
なのに、コードを書く事こそが仕事だと思っているコーダさんたちは「そんなの馬鹿げてる、仕様を変えるべきだ」って言うんでちゅよねぇ。
象しゃんは一生懸命、上流を変えろって言ってまちたよねぇ。
いわもとしゃんって人も、仕様がおかちい仕様を変えろって言ってまちた。
動的に生成された複数の要素に、生成されたタイミングで処理を行いたい
本当に、頭がおかちいと思うでちゅ。コードが書けるのが偉いんじゃない、問題を解決できるのが偉いのでちゅよねぇ。
なお、今ぽっくんの使っているバリデーターのコードは遥かに洗練されていまちゅが、現状は社外秘になっているので内緒でちゅ。