プラグイン
Smart Custom Fields
Custom Fields Template
を使っていて不便に思ったこと。
グループを作った場合、グループ内の特定の項目だけを増殖させたい。
これが出来ない。
グループ内の特定の項目だけを増殖
入力項目が
ーーーーーーー
種類
料理名
値段
ーーーーーーー
こういうグループを「groups」というグループ名で作る。(グループラベルは「メニュー」とする)
入力内容はこんな感じ。
「メニュー」
ーーーーーーー
種類:ご飯もの
料理名:チャーハン
値段;700円
ーーーーーーー
「追加」をして次は
ーーーーーーー
種類:麺類
料理名:ラーメン
値段;600円
ーーーーーーー
こんな風に入れる。
だけど一つの「種類」に対して複数の「料理名・値段」だけを追加したい場合
ーーーーーー
種類:ご飯もの
料理名:チャーハン
値段;700円
料理名:天津飯
値段;900円
ーーーーーー
こうしたい場合は出来ない。
解決策
入力側では出来ないみたいなので出力側でがんばってみる。
入力側では
ーーーーーー
種類:ご飯もの
料理名:チャーハン
値段;700円
ーーーーーー
種類:ご飯もの
料理名:天津飯
値段;900円
ーーーーーー
種類を同じにして複数登録する。
出力側の処理
例えばグループ「groups」の内容が次のようになっている場合
ーーーーーー
種類:ご飯もの
料理名:チャーハン
値段;700円
ーーーーーー
種類:ご飯もの
料理名:天津飯
値段;900円
ーーーーーー
種類:麺類
料理名:ラーメン
値段;700円
ーーーーーー
種類:麺類
料理名:タンメン
値段;900円
ーーーーーー
種類ごとにグループ分けしてあげる。
///////////////
種類:ご飯もの
料理名:チャーハン
値段;700円
ーーーーーー
種類:ご飯もの
料理名:天津飯
値段;900円
//////////////
種類:麺類
料理名:ラーメン
値段;700円
ーーーーーー
種類:麺類
料理名:タンメン
値段;900円
ーーーーーー
こうなっていればHTMLで出力するときに
ご飯物ボックス
麺類ボックス
が別個に作れる。
スクリプト
$groupsというオブジェクトには
(種類)[service]=>’ご飯もの’
(料理名)[name]=>’チャーハン’
(値段)[price]=>’700円’
これが1要素になった配列が入っている。
ーーーーーー
種類:ご飯もの
料理名:チャーハン
値段;700円
ーーーーーー
種類:ご飯もの
料理名:天津飯
値段;900円
ーーーーーー
種類:麺類
料理名:ラーメン
値段;700円
ーーーーーー
種類:麺類
料理名:タンメン
値段;900円
ーーーーーー
まず1回 foreachで回して(種類)だけを取り出す。
$service = "";
$service_ary = array();
//-----serviceだけ取り出す----------
foreach($groups as $group ){
$service = $group['service'];
array_push($service_ary, $service);
}
$service_aryの中身
(ご飯もの、ご飯もの、麺類、麺類)
こんな感じになっている。
重複しているものを整理する。
$service_ary = array_unique($service_ary);
(ご飯もの、麺類)になった。
しかしvar_dumpしてみると
array(2) {
[0]=>
string(3) "CUT"
[2]=>
string(4) "perm"
}
重複していた[1][3]がカットされたのでkeyが連番になっていない。
もう一度foreachで回して入れ替える。
$edit_service_ary = array();
foreach($service_ary as $part ){
array_push($edit_service_ary, $part);
}
これで連番になった$edit_service_ary(ご飯もの、麺類)が出来た。
これを使って「ご飯もの、麺類」のグループ分けをする。
////////////グループ分け////////////////////
$edit_service_aryの要素数を取得。 $ary_num = count($edit_service_ary);
要素数の数だけ配列 $a1, $a2, ・・・を用意する。
for($i=0; $i<$ary_num; $i++){
$a{$i} = array();
}
同じ「種類」(service)のセットを $a1などの配列にまとめていく。
foreach($groups as $group ){
$service = $group['service'];
for($i=0; $i<$ary_num; $i++){
if($service == $edit_service_ary[$i]){
array_push($a{$i}, $group);
}
}
}
出来たものは
for($i=0; $i<$ary_num; $i++){
var_dump($a{$i});
}
これで確認出来る。