配列から一番近い値を取り出す - PHPプロ!Q&A掲示板

2626

  • 0P

配列から一番近い値を取り出す

質問日時 / 2010年3月15日 11:54    回答数 / 6件

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

キーワード / 比較    配列    抽出   

お世話になります。

  1. $a = array(100,200,300,400,500);
という配列から、
  1. $b = 250;
よりも小さくて、一番近い値(この場合は200)を返してほしいのですが
やり方がわかりません。

どなたかご教示願えませんでしょうか。
よろしくお願いいたします。

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



ツリー一覧

┣A01kaitau・数値順にソートで格納してからforかforeachでループ
┃┗A01-1toriponなるほど、勉強になります。 ロジックをぱっと思いつ
┣A02shimix「xxxよりも小さくて一番近い」値ということは、「xxx
┃┗A02-1toripon>「xxxよりも小さくて一番近い」値ということは、「xx
┣A03yuu_a0配列が昇順に並んでいるんでしたら。 >>CODE <?php
┃┗A03-1toripon勉強になります。 アドバイスをありがとうございまし
┣A04yuu_a0この意見は投稿者によって削除されました。
┗A05yuu_a0この意見は投稿者によって削除されました。

回答一覧

並び替え:

A01 参考になった
answererkaitau [3月15日 12:28]

・数値順にソートで格納してからforかforeachでループするか再帰処理
もしくは、
・一通りループでまわして、条件を満たす場合に常に「一番近い値」と比較を行って
 大きい場合に「一番近い値」に置き換え、最後に生き残った物が勝ち

他にもいくらでもロジックありそうですが。

この意見に回答する

ツリーへ TOPへ

A01-1
replyertoripon [3月15日 13:30]

なるほど、勉強になります。
ロジックをぱっと思いつくようになりたいです^^;
アドバイスありがとうございました。

この意見に回答する

ツリーへ TOPへ

A02 満足
answerershimix [3月15日 12:31] (最終編集:3月15日 12:33)

「xxxよりも小さくて一番近い」値ということは、「xxx以下の中で最大」ということになりますよね?

  1. <?php
  2. $a = array(100,200,300,400,500);
  3. $b = 250;
  4.  
  5. $result = 0// この初期値はちょっと工夫すべきかも・・
  6. foreach ($a as $val) {
  7.     if ($val > $b) { continue} // xxx以上はskip
  8.     if ($val > $result) { $result = $val}
  9. }
  10.  
  11. print $result;
  12. ?>

多分、sortして処理するよりは速い・・かも(ひょっとしたら遅いかもしれない)。まったくの未検証ですのであしからず(汗

この意見に回答する

ツリーへ TOPへ

A02-1
replyertoripon [3月15日 13:28]

>「xxxよりも小さくて一番近い」値ということは、「xxx以下の中で最大」ということになりますよね?

あ、そうですね!言われてみてはっとしました。
「一番近い」の部分で、ぐるぐるとループしてしまっていました^^;
コード例もありがとうございます。
頂いたコードも含めていろいろやってみます。
ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A03 参考になった
answereryuu_a0 [3月15日 22:24] (最終編集:3月15日 22:47)

配列が昇順に並んでいるんでしたら。
  1. <?php
  2. function asearch($n$ary) {
  3.   $l = 0$r = count($ary);
  4.   
  5.   while ($r - $l > 1) {
  6.     $ary[$m = ($l + $r) >> 1] < $n ? ($l = $m) : ($r = $m);
  7.   }
  8.   
  9.   return $ary[$r] == $n ? $ary[$r] : $ary[$l];
  10. }
  11. ?>

など。

要素数が少ない場合は、前から順に調べたほうが早いと思います。
また、例示のように、単純な数でしたら、百の位だけ取り出して検索などでもいいと思います。

  1. <?php
  2. $a = array(100,200,300,400,500);
  3. $b = 250;
  4.  
  5. $i = 0$n = count($a);
  6. while ($a[++$i] < $b && $i < $n);
  7.  
  8. echo $a[$i-1];
  9. ?>

この意見に回答する

ツリーへ TOPへ

A03-1
replyertoripon [3月16日 02:21]

勉強になります。
アドバイスをありがとうございました。

この意見に回答する

ツリーへ TOPへ

A04
answereryuu_a0 [3月15日 22:24]

この意見は投稿者によって削除されました。

ツリーへ TOPへ

A05
answereryuu_a0 [3月15日 22:24]

この意見は投稿者によって削除されました。

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

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