配列から条件をつけて抜き出す方法 - PHPプロ!Q&A掲示板

341

  • 300P

配列から条件をつけて抜き出す方法

質問日時 / 2007年2月3日 11:19    回答数 / 5件

Questioner:  yumisaiki  このエントリーをはてなブックマークに追加 

キーワード / 配列の検索    配列のフィルター    配列の加工   

カレンダーを使って行事を自動的に表示させるPHPを作ろうとしていて、やっぱりできません…。
簡単なことだと思うのですが、例えば 今日が30日だとしたら
配列に 以下のような (01,25,28,30)と いう数字が入っていたとして、
30だけを抜き出して表示させるというのが 簡単なようでわかりません。

array_search だと 3 という表示が出てしまい、配列の3番目になっているということが出てしまうようです。

本をよみながら フィルターというのをためして見ましたが(以下) これだと何も表示されません。

単純に 今日が30なら 30と表示させ、 31だと何も表示されない。
というふうにはどうしたらできるんでしょうか?


<?php
$day     = date("d"); //日
$ary1=array(01,25,28,30);

function myFilter($today){
 if($day == $today){
 return TURE;
 }else{
 return FALSE;
 
   }}
print_r(array_filter($ary1,"myFilter"));


?>

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01dozoyousanarray_filterよりはarray_searchだと思いますが。
┣A02signal希望通りの結果を望むなら dozoyousan さんの言われる
┣A03moochomoochoと申します。 dozoyousanさんの補足的になり
┣A04dala00基本的にはarray_searchでいけます。 ただマニュア
┗A05yumisaikiなぜ、うまく表示されなかったのか、疑問が解決しまし

回答一覧

並び替え:

A01
answererdozoyousan [2月3日 12:02] (最終編集:2月3日 20:09)

array_filterよりはarray_searchだと思いますが。

  1. <?php
  2.     $day     = date("d")//日
  3.     $ary1=array(01,25,28,30);
  4.     
  5.     $key = array_search( $day$ary1 );
  6.     if( $key !== false )
  7.        echo $ary1[ $key ];
  8.     else
  9.        echo "not found";
  10.     
  11. ?>

流れからすると配列ではなく連想配列を使うのが良いと思います。

追記:
ご指摘のとおり0が返ってきたらelse側に行ってしまいますね。
ちょっと修正しました。

この意見に回答する

ツリーへ TOPへ

A02 満足
answerersignal [2月3日 14:17]

希望通りの結果を望むなら dozoyousan さんの言われるように
array_search を使うのが良いと思われます。


個人的に array_filter の使い方がいまいちわからなかったので
調べてみた結果の蛇足です。


yumisaiki さんのコードの array_filter の使い方は間違って
いないのですが、結果が出力されない原因は

  1. if($day == $today){
ここでグローバル変数が関数内で使用されているためです。

1行上で
  1. $day = date('d');
もしくは
  1. global $day;
をするといいでしょう。

ただ
  1. print_r(array_filter($ary1,"myFilter"));
の結果は

Array ( [3] => 30 )

こうなるので、使い勝手は悪いかもしれません。

もしも・・・
  1. $ary1 = array(
  2.   '歯医者' => 2,
  3.   '遊園地' => 15,
  4.   '買い物' => 15,
  5.   '出張' => 25,
  6. );
というユニークなイベントをキーに、値を日付にした連想配列を
使用するなら array_filter は便利かもしれませんね。

この意見に回答する

ツリーへ TOPへ

A03
answerermoocho [2月3日 16:10]

moochoと申します。

dozoyousanさんの補足的になりますが、array_searchを試された後、
in_arrayでも試してみてください。

array_searchだと配列のkeyが返ってくるので
最初の配列に一致した場合に0が返ってきてしまうので
else文法の結果に遷移してしまいます。

in_arrayであれば、true、falseで返ってくるので
存在するかどうかが正確に判別できます。

この意見に回答する

ツリーへ TOPへ

A04
answererdala00 [2月3日 19:39]

基本的にはarray_searchでいけます。

ただマニュアルを読むとおわかりになると思いますが、
if( !array_search( *** ) )
だとキーが0で発見された場合も
あたかも見つからなかった様にはじかれてしまいますので、
かならず
if( array_search( *** ) !== false )
で判断するようにして下さい。

この意見に回答する

ツリーへ TOPへ

A05
answereryumisaiki [2月5日 01:53]

なぜ、うまく表示されなかったのか、疑問が解決しました。
グローバル関数の使い方もよくわかりました。

ありがとうございました。

がんばります。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
array_mergeの再帰処理の動作について
 このエントリーをはてなブックマークに追加 
A
>1個になったとき$leftを返しますが、 >このとき、最終的な$leftはnullになるかと思います。 いいえ、最後は「渡された配列をそのまま」返します。要素が2以上あるときとの違いは(並べ替えずに戻るので...

>>続きを読む

再帰関数は最初の内は混乱しますが、非常に上手く使える場面もいずれ出てきます。これを機会に学んでいけるといいですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)