![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# int temp = 0; if(isdigit(arr[i])){//文字が数字であれば(0~9) 1 2022/03/27 01:37
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP c言語 文字 - '1'+26 3 2022/03/26 20:58
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- 小学校 公倍数について 2 2022/12/16 16:12
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
- 数学 連続する3つの整数の積が6の倍数であることを示せ 連続する2つの整数の積が2の倍数なのであとは 連続 7 2023/07/02 22:30
- 数学 8の倍数の証明(nの倍数の証明)をするとき、 k,lを整数とすると、−8(k+l)が8の倍数って答え 3 2022/12/02 17:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マッチング処理(1:N)
-
配列から順位を算出したい
-
PHPで連想配列のプルダウンメニ...
-
Excel VBAでフィルター後の対象...
-
PHPからCSVをアップロード後、m...
-
配列を回すとき、最後の要素だ...
-
配列の添え字が小数だとどうなる?
-
CSVデータの行数カウントをした...
-
別ファイルの構造体の値を読み...
-
配列の初期化
-
順位を付ける時のスコアの重複...
-
file_existsでファイル名の部分...
-
CSVファイルの最終行のデー...
-
foreachのなかで次のキーを参照...
-
チェックボックス複数選択 mys...
-
漢字のソートについて
-
配列の要素(value)に、変数を...
-
String だと「 ByRef引数の型が...
-
verilogで、配列の一部をタスク...
-
phpで、連想配列を普通の配列に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
重複確認
-
foreachで上限回数指定方法また...
-
マッチング処理(1:N)
-
Excel VBAでフィルター後の対象...
-
VB.NET で 二次元のハッシュは...
-
多次元配列を、1次元の配列にす...
-
SELECT 使用時の bindValue の...
-
Smartyでインクリメント
-
PHPでこのコード自体に意味は無...
-
PHP、{}記号の意味
-
配列を比較して同じものがあっ...
-
phpでforeachの中にforeachがあ...
-
多次元配列の中で条件に合う要...
-
sqlのデーターを『あ行』『か行...
-
ラジオボタンをランダムに表示...
-
キーが倍数の時の値の存在チェ...
-
三重県南部の温泉
-
foreachで配列を、左から縦3列...
-
ジャグ配列
-
構造体の中でユーザー定義型の...
おすすめ情報