人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPで配列の重複削除がうまくいきません。wordpressでサーバーのpostmetaテーブルの、ある特定のmeta_keyのmeta_valueをリスト表示させたいと考えております。下記のコードで
$array = $value->meta_value;
でこの習得した$array配列の中身のリスト表示はできたのですが重複しているものがあるため、さらに重複を削除させるために
$result = array_unique($array);
を追加したのですが、$resultを表示させようとするとなぜかうまく結果が表示されません。
原因はわかりますでしょうか?(array_uniqueはforeachの後に置く?)

↓コードです。
>||
<?php
global $wpdb;
$data = $wpdb->get_results( "
SELECT meta_value
FROM $wpdb->postmeta
WHERE meta_key = '◯◯◯'
" );

foreach ($data as $value) {
$array = $value->meta_value;
$result = array_unique($array);
print_r($result);

}
?>
||<

●質問者: javelover
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● TransFreeBSD
ベストアンサー

配列なのは$arrayでなく$dataです。
だからforeachに$dataを渡すのです。

Array
(
 [1] => Array
 (
 [meta_value] => ○
 )
 [2] => Array
 (
 [meta_value] => ×
 )
 [3] => Array
 (
 [meta_value] => △
 )
 ...
)

です。

この場合はget_resultsよりget_colでしょう。
素直な配列になります。
そして配列個々を処理するforeachの前に配列全体を処理するarray_uniqueを使います。


しかし、そもそも重複をなくすためにSELECT DISTINCTを使うのが一番の方法だと思います。


javeloverさんのコメント
ありがとうございます! $dataのほうが配列だったのですね、、SELECT DISTINCTを追加したら重複されずにうまく抽出できました。あともう1つ疑問点があります。例えば、FROM $wpdb->postmetaを使って、2つのデータを別々に取ってくる場合、それらを、交互に表示させたいのですが、 表示のところがよくわかりません。 foreachだと2つの配列から交互に表示できなかったので、 for文を使ってみたのですが、どこがおかしいのかアドバイス頂けたら幸いです。 <?php global $wpdb; $data1 = $wpdb->get_results( " SELECT distinct meta_value FROM $wpdb->postmeta WHERE meta_key = '◯◯' " ); $data2 = $wpdb->get_results( " SELECT distinct meta_value FROM $wpdb->postmeta WHERE meta_key = '△△' " ); for ($s=0; $s <count($data1); $s++) { $array[$s] = $data1->meta_value; $array2[$s] = $data2->meta_value; echo $array[$s]; echo $array2[$s]; } ?>

TransFreeBSDさんのコメント
配列なのは$dataです。 だから$dataに[○]を使います。 表示するだけならわざわざ変数に入れる必要がありません。 echo $data1[$s]->meta_value; echo $data2[$s]->meta_value; あと、単なる慣例ですが、forで単に数字を回すときは$iを使います。 加えて、forを使うならforのマニュアルも読みましょう。基本の配列の回しかたもあります。 http://php.net/manual/ja/control-structures.for.php この場合はget_resultsよりget_colでしょう。 素直な配列になります。 それなら以下で済むと思います。 echo $data1[$i]; echo $data2[$i]; get_resultsを使うならget_resultsのマニュアルも読みましょう。get_colも書いてあります。 https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpdb_Class

javeloverさんのコメント
お忙しい中本当にありがとうございました。 echo $data1[$s]->meta_value; echo $data2[$s]->meta_value; こちらの方法で for ($i = 0; $i < **; $i++){ を追加してうまくいきました。 最初なぜか、この出力がうまくいかず、配列にわざわざ入れたりして難儀しておりました。あと、get_colのほうだと、meta_valueを最初から取ってくるやり方になるのですね。つまり、->meta_value がいらないくなるのですね。じっくりget_colのほうを読んでみたいと思います。ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ