PHP5.2.4を使用しています。
連想配列のキーが[]で囲まれている時、
その中の数字が倍数としてチェックされるとします。
次の例では、3と4の倍数の時に条件(if (is_int($wk)))に引っかかり
キーの値(3の倍数です、など)が表示されます。
ただこのやり方だと、foreachでループさせないと倍数かどうかが分からないので、
もっと効率の良い(isset($arr[$i])で調べられるような)調べ方はできないでしょうか?
$arr = array(
'1' => '1です',
'2' => '2です',
'[3]' => '3の倍数です',
'[4]' => '4の倍数です',
);
for ($i = 1; $i < 15; $i++)
{
if (isset($arr[$i])) //←全てこの(簡単な)条件式で調べられれば良いのですが・・・
{
print "{$arr[$i]}<br>\n";
}
foreach ($arr as $key => $value)//←キーが倍数かはどうしても全てのキーをチェックせざるえない
{
if (preg_match("/\[(\d+)\]/", $key, $match))
{
$wk = $i / $match[1];
if (is_int($wk)) //←除算した結果が整数ならその倍数だと判明
{
print "i={$i} {$arr[$match[0]]}<br>\n";
}
}
}
}
1です
2です
i=3 3の倍数です
i=4 4の倍数です
i=6 3の倍数です
i=8 4の倍数です
i=9 3の倍数です
i=12 3の倍数です
i=12 4の倍数です
i=15 3の倍数です
No.3ベストアンサー
- 回答日時:
倍数チェック用の配列 ($arr2) を前もって作成してチェックすれば isset() にてチェック可能なロジックが組めるのではと思います。
以下のようなロジックではどうでしょうか?しかしながら、これが全ループで逐次チェックする方法に比べて計算回数が多いか少ないかは当方もわかりません。
(ロジック例)
$imax = 100; // $i の最大値
$arr2 = array();
foreach ($arr as $key => $val)
{
if (substr($key, 0, 1) == '[')
{
$num = substr($key, 1, -1);
if ($num <= 0) { print('error'); exit; }
$jmax = (int)($imax / $num);
for ($j = 1; $j <= $jmax; $j ++)
{
$k = $j * $num; // 倍数
if (!isset($arr2[$k])) { $arr2[$k] = array(); }
$arr2[$k][] = $val;
}
}
}
for ($i = 1; $i <= $imax; $i++)
{
if (isset($arr[$i]))
{
print "{$arr[$i]}<br>\n";
}
if (isset($arr2[$i]))
{
print join("<br>\n", $arr2[$i]);
}
}
ご返答ありがとうございます。
なるほど、こういうやり方もあるわけですね。
確かにキーの数によるとは思いますが、
自分が示した例よりは効率が良いような気がします。
No.4
- 回答日時:
こんなのは、どうでしょう?
<?php
$arr = array(
'1' => '1です',
'2' => '2です',
'[3]' => '3の倍数です',
'[4]' => '4の倍数です',
);
foreach($arr as $k => $v) {
if(preg_match('/\[(\d+)\]/', $k, $m)) {
$arrCheck[$m[1]] = $v;
} else {
$arrNoCheck[$k] = $v;
}
}
for($i = 1; $i < 15; $i++) {
if(isset($arrNoCheck[$i])) {
echo "{$arr[$i]}<br>\n";
} else {
foreach($arrCheck as $k => $v) {
if($i % $k == 0) {
echo "i={$i} {$arrCheck[$k]}<br>\n";
}
}
}
}
?>
ご返答ありがとうございます。
いくらかは効率が良くなっていますが、
やっぱり
> foreach($arrCheck as $k => $v) {
を使っているということは、
ほとんどの$iに対して調べるということなので
このループを使わずにできないものでしょうか?
No.2
- 回答日時:
倍数かどうかの判定は余りを求める剰余演算子「%」で結果が0かどうかを調べれば簡単にだせるかとおもいます。
for ($i = 1; $i < 15; $i++)
print "i=" . $i;
if($i % 3 == 0){
print " 3の倍数です";
}
if($i % 4 == 0){
print " 4の倍数です";
}
print "<br>\n";
}
参考URL:http://jp2.php.net/manual/ja/language.operators. …
ご返答ありがとうございます。
確かにそうなんですが、3の倍数か5の倍数か8の倍数か
どの倍数がその配列にセットされてるかは分からなくて
それを調べるという作業をやりたいのです。
saintandreさんのやり方だと、
3の倍数がキーにセットされてるか調べる時は
if($i % 3 == 0){
print " 3の倍数です";
}
4の倍数がキーにセットされてるか調べる時は
if($i % 4 == 0){
print " 4の倍数です";
}
とその都度書き足さないといけなくて、
ではループなら自分が示した例(
QNo.4051581のforeach ($arr as $key => $value)//←キーが倍数かはどうしても全てのキーをチェックせざるえない
)のように一つにまとめて書くことができるのですが、
それは効率が悪そうなのでやりたくないのです・・・
できれば、1や4など(つまり倍数としてじゃなく)を調べる
if (isset($arr[$i]))
のようにループを使わずにそのキーがセットされてるか調べたいのですが
このようなことは可能なのでしょうか?
No.1
- 回答日時:
gmpライブラリでソースを簡略化できるかもしれません
http://www.php.net/manual/ja/book.gmp.php
ちなみに命題があいまいでよくわからないのですが・・・
これは素数以外のデータをとりたいということでしょうか?
そうなると3は素数ですが、3は3の倍数というのが理解できません。
4は2の倍数ですよね?14は2の倍数ですがよろしいのでしょうか?
ご返答ありがとうございます。
すいません、
自分も内容の説明もそうですが、どういう題名をつけるべきか迷いました・・・
>http://www.php.net/manual/ja/book.gmp.php
見てみたのですが、この中にはなさそうだと思うのですが、、
何か使えるのはあるのでしょうか?
これは素数とかは関係なくて、
$iの値が
3の倍数なら3,6,9,12・・・
4の倍数なら4,8,12,16・・・
となったときに、そのキーの$arrがセットされてるか値を調べたいのです。
単にキーが1とか3なら
if (isset($arr[$i]))
で値がセットされてるか調べられますよね。
だけど、5の倍数の時を調べたいとなると、
if (isset($arr[$i]))
↑このやり方だと、$iがループしてきて5の時は調べられますけど
次の10や15のときはこのままの条件式だと無理ですよね?
でもだからといってforeachを使ってまた全部のキーを調べるやり方は
効率が悪いのでやりたくないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NET で 二次元のハッシュは...
-
リストボックス複数選択抽出方法
-
Mac トロイの木馬”Flashback"に...
-
textより$$にはさまれた文字列...
-
smarty 条件文
-
関数の引数に配列を初期化なしで。
-
キーが倍数の時の値の存在チェ...
-
PHPで変数名にハイフンを使うに...
-
連想配列でキーを利用して一部...
-
C言語の配列をPush(追加)する...
-
foreachのなかで次のキーを参照...
-
配列をループでたくさん宣言し...
-
FortranのOPEN文
-
multiple属性のPOSTを配列で受...
-
UTF-8のXMLがSJISのPHPで文字化け
-
PHP: 未定義エラーの回避方法を...
-
String だと「 ByRef引数の型が...
-
ヒアドキュメントの中のfor文
-
ファイルの書き込みについて教...
-
file_existsでファイル名の部分...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pdfファイルの複数添付 引数の型
-
VB.NET で 二次元のハッシュは...
-
phpでforeachの中にforeachがあ...
-
マッチング処理(1:N)
-
Excel VBAでフィルター後の対象...
-
3つの連想配列を交互に代入し...
-
PHPで連想配列のプルダウンメニ...
-
PHPで変数名にハイフンを使うに...
-
PHP、{}記号の意味
-
ftokが動かない?
-
Delphi XEの警告文を消したい
-
foreachとかの勝手な省略?
-
配列からプルダウン用のHTMLを生成
-
PHPの構文で間違えが分からない
-
php 省略可能な引数配列を持つ...
-
foreachで上限回数指定方法また...
-
重複確認
-
Ruby 2次元のハッシュ
-
php mysql INSERT
-
foreachで配列を、左から縦3列...
おすすめ情報