こんにちは。
foreach の前で var_dump($sicon); としてみると、どのように表示されますか?
getspaceさん、ご返信ありがとうございます。
早速試してみたところ。。。
=====================================
◎「C」「B」「A」の場合
array(5){
[0]=> atring(0)””
[1]=> string(0)””
[2]=> string(4)”C”
[3]=> string(4)”B”
[4]=> string(6)”A”
}
◎「A」「B」「C」の場合
array(5){
[0]=> string(6)”A”
[1]=> string(4)”B”
[2]=> string(4)”C”
[3]=> string(0)””
[4]=> string(0)””
}
◎「E」「C」「B」「A」の場合
array(5){
[0]=> string(0)””
[1]=> string(5)”E”
[2]=> string(4)”C”
[3]=> string(4)”B”
[4]=> string(6)”A”
}
=====================================
という値が表示されました。
見ると、毎回バラバラに設定されているようですが、
これは設定がされていないということでしょうか?
これは設定がされていないということでしょうか?
という事ではなく、「意図した通り(アルファベット順)に保存されていない」が正しいかと思います。
厳密な挙動は見ていませんが、クリックした順番とかで配列に格納し、データベースに保存しているのではないでしょうか。(カテゴリーとかがそう)
foreachは0番目から順番に処理しますので、
保存されている順番通りなら正しい挙動です。
じゃ、どうするかというと、カスタムフィールドの値を取り出したあとに
アルファベット順になるようにsort関数で配列を組み直してから、
foreachでループすればいいと思います。
※未検証ですが
<?php
$icons = get_post_meta($post->ID, 'icon', false); // get_post_metaを使うと配列で返せる
sort($icons);
foreach ($icons as $icon) {
switch($icon) {
case 'A';
echo "<img src='画像のURL' />";
break;
case 'B';
echo "<img src='画像のURL' />";
break;
case 'C';
echo "<img src='画像のURL' />";
break;
case 'D';
echo "<img src='画像のURL' />";
break;
case 'E';
echo "<img src='画像のURL' />";
break;
}
}
?>
getspaceさん、ご教示ありがとうございます。
早速試してみたところ、
====================================
「C」「B」「A」の場合
↓
「B」「C」「A」
「A」「B」「C」の場合
↓
「B」「C」「A」
「E」「C」「B」「A」の場合
↓
「E」「B」「C」「A」
====================================
となりました。
チェックを「A」から押しても同じ結果でした。
相変わらず、表示順が逆からなのが気になります。
お手数おかけしますが、ご教示をいただけないでしょうか。
よろしくお願いします。
このコードを実施するとどうなりますか?
<?php
$icons = get_post_meta($post->ID, 'icon', false); // get_post_metaを使うと配列で返せる
echo "<div>保存されている配列</div><pre>"
var_dump($icons); // 保存されたままの状態の配列を表示
echo "</pre>"
$sort_icons = sort($icons); // 配列をソートし直す
echo "<div>ソートし直した配列</div><pre>"
var_dump($sort_icons);
echo "</pre>"
?>
先の投稿にも書きましたが、foreachは0番目から順番に処理します。
カスタムフィールドに保存されている順番が(理由はどうあれ)表示したい順番でなければ、
一度取得した配列を、表示したい順番に並べ直すという処理が必要です。
getspaceさん、ご教示ありがとうございます。
配列の表示を試してみました。
◎表示順を「A」「B」「C」としたい場合
===================================
保存されている配列
array(3) {
[0]=>
string(4) “C”
[1]=>
string(4) “B”
[2]=>
string(6) “A”
}
または
array(3) {
[0]=>
string(6) “A”
[1]=>
string(4) “B”
[2]=>
string(4) “C”
}
ソートし直した配列
bool(true)
array(3) {
[0]=> string(4) “B”
[1]=> string(4) “C”
[2]=> string(6) “A”
}
===================================
◎表示順を「A」「B」「C」「E」としたい場合
===================================
保存されている配列
array(4) {
[0]=>
string(6) “A”
[1]=>
string(4) “B”
[2]=>
string(4) “C”
[3]=>
string(5) “E”
}
または、
array(4) {
[0]=>
string(5) “E”
[1]=>
string(4) “C”
[2]=>
string(4) “B”
[3]=>
string(6) “A”
}
ソートし直した配列
bool(true)
array(4) {
[0]=> string(5) “E”
[1]=> string(4) “B”
[2]=> string(4) “C”
[3]=> string(6) “A”
}
===================================
ソートし直した配列は全て順番が逆になってしまっているようですが、
(しかもBとCが必ず逆)
保存した配列が順番どおりだったり逆順だったりするのが気になります。
カスタムフィールドテンプレートには
「A」「B」「C」「D」「E」の順番で
チェックボックスを設定しています。
何か順番を不安定にさせる要素があるのでしょうか。
こちらもで確認しました。
カスタムフィールドテンプレートの設定
[icon]
type = checkbox
value = A#B#C#D#E
label = 画像を選択してください。(複数選択可)
出力時のコード
<?php
$icons = get_post_meta($post->ID, 'icon', false); // get_post_metaを使うと配列で返せる
echo "<div>保存されている配列</div><pre>";
var_dump($icons); // 保存されたままの状態の配列を表示
echo "</pre>";
sort($icons); // 配列をソートし直す
echo "<div>ソートし直した配列</div><pre>";
var_dump($icons);
echo "</pre>";
?>
ソートし直した配列
array(3) {
[0]=>
string(1) "A"
[1]=>
string(1) "C"
[2]=>
string(1) "D"
}
カスタムフィールドのvalueがすべて半角英数字なら期待通りの動作になるはずです。
(string(1)となる)
naga0825さんの場合、
[0]=> string(5) “E”
となっているので、何か余計な値が保存されていませんか?
もう一度設定を見直してみてはどうでしょ?
gatespaceさん、
わざわざ検証ありがとうございます。
テンプレートを新しくして試してみたところ
「A」「B」「C」や
「A」「B」「C」「E」と表示されました!
ありがとうございます!
ご指摘のあった
>[0]=> string(5) “E”
>となっているので、何か余計な値が保存されていませんか?
これは、valueの値を表示させるタイトルにあわせてたもので、
実際には
「AAAAAA」
「BBBB」
「CCCC」
という値にしていたので(4)や(6)が表示されていたのだと
思います。
つまり、valueの値は揃えないと安定しないということでしょうか。
PHPのsort関数につてはリンク先を見てもらうとして、今回のように配列の値をソートする前提なら、valueの値は単純なものにした方が無難です。(アルファベットではなく数字にすると確実かも)
カスタムフィールドテンプレートであれば、valueとは別に
valueLabel = apples # oranges # bananas
の形で表示用ラベルを設定できます。
gatespaceさん、ご教示ありがとうございます。
valueの値についてやsort関数については、
目を通してみてもまだちょっと分からなかったです。
これはPHPの勉強不足だと思うので、理解できるよう
頑張りたいと思います。
「valueLabel」、ちゃんと用意されていたんですね。
気がつきませんでした。
「value」を入れたら名前表示されたので
そういうものだと勝手に解釈してました。
だから不安定になったのかもしれません。
本当にありがとうございました。