やりたいことは、
$hoge = array ( 0 => '1', 1 => '2', 2 => '3', 3 => '3', 4 => '3' );
のような配列があったとします。
この配列の値の出現頻度を調べて、
$hoge_syutugen_hindo = array_count_values($hoge);
print_r($hoge_syutugen_hindo);
$hoge_syutugen_hindoの結果
Array ( [1] => 1 [2] => 1 [3] => 3 )
$hoge_syutugen_hindoの結果で[3]の出現頻度が3回以上あったら、
Array ( [1] => 1 [2] => 1 [3] => 3 ) を Array ( [1] => 1 [2] => 1 [4] => 1 ) に変更。
少ない場合は
Array ( [1] => 1 [2] => 1 [3] => 2 ) を Array ( [1] => 1 [2] => 1 [3] => 2 )
そのままの配列を返したいのです。
$hogeの配列の値には必ずしも1や2が含まれるわけではありません。
$hoge = array ( 0 => '3', 1 => '3', 2 => '3' ); や$hoge = array ( 0 => '1', 1 => '3', 2 => '3', 3 => '3' ); のようなパターン等もあります。
わたしなりに下記のようなスクリプトを作成しましたが、
$arr_pattern = '/^(3\s=>\s)[3-99]$|^(3=>)[3-99]$|^(3=>\s)[3-99]$|^(3\s=>)[3-99]$|^(3\s=>\s)\'[3-99]\'$|^(3=>)\'[3-99]\'$|^(3=>\s)\'[3-99]\'$|^(3\s=>)\'[3-99]\'$|^(\[3\]\s=>\s)[3-99]$|^(\[3\]=>)[3-99]$|^(\[3\]=>\s)[3-99]$|^(\[3\]\s=>)[3-99]$|^(\[3\]\s=>\s)\'[3-99]\'$|^(\[3\]=>)\'[3-99]\'$|^(\[3\]=>\s)\'[3-99]\'$|^(\[3\]\s=>)\'[3-99]\'$/';
reset($deliyery_kind_syutu);
while(list($k, $v) = each($deliyery_kind_syutu)) {
$kv = "$k=>$v";
if(preg_match($arr_pattern, $kv)){
$new_hkv = preg_replace($arr_pattern,'4 => 1', $kv);
$n = count($deliyery_kind_syutu);
for($i=0; $i<$n; $i++){
$new_array[] = ($deliyery_kind_syutu[$i]);
}
$new_array[] = $new_hkv;
}
}
array ( 0 => NULL, 1 => 1, 2 => 1, 3 => '4 => 1', )となり、array(1 => 1, 2 => 1, 4 => 1)のような結果になりませんでした。
分かる方が見えましたらご教授ください。
No.3ベストアンサー
- 回答日時:
あ、3回より多いじゃなくて3回以上でよかったんでしたっけ?
if($hoge_syutugen_hindo[3]>3){
のところを
if($hoge_syutugen_hindo[3]>=3){
つまり、「以上」にしてみてください
yambejp様
条件分岐だけのために回答いただきまして、ありがとうございます。
回答いただく前に3回以上で動作させていただきました。
結果は
Array ( [1] => 1 [2] => 1 [4] => 1 )
と思うような処理ができました。
ありがとうございました。
unset()関数が今回のみそでした。
いろいろ、削除する関数を探したのですが、どれも思うような関数にめぐり会えませんでしたが、unset()関数はいいですね。
条件にあった関数をおしえていただきありがとうございました。
No.2
- 回答日時:
そうですか・・・、そういう仕様であるなら仕方ないですね。
以下でよいのでは?
$hoge_syutugen_hindo = array_count_values($hoge);
if($hoge_syutugen_hindo[3]>3){
unset($hoge_syutugen_hindo[3]);
$hoge_syutugen_hindo[4]++;
//もしくは$hoge_syutugen_hindo[4]=1;
}
この回答への補足
yambejp様
失礼いたしました。
if文を外すと思うような結果になっていました。
それを確かめず、展開が必要なのではと発言してしまってすいませんでした。
>$hoge = array ( 0 => '1', 1 => '2', 2 => '3', 3 => '3', 4 => '3' );
>$hoge_syutugen_hindo = array_count_values($hoge);
>//if($hoge_syutugen_hindo[3]>3){
>unset($hoge_syutugen_hindo[3]);
>$hoge_syutugen_hindo[4]++;
>//もしくは$hoge_syutugen_hindo[4]=1;
>//}
print_r($hoge_syutugen_hindo);
結果
Array ( [1] => 1 [2] => 1 [4] => 1 )
処理は条件を満たしていました。
条件分岐だけのうまく働きませんでした。
yambejp様 早速の回答ありがとうございます。
動作させてみたところ
>$hoge = array ( 0 => '1', 1 => '2', 2 => '3', 3 => '3', 4 => '3' );
>$hoge_syutugen_hindo = array_count_values($hoge);
>if($hoge_syutugen_hindo[3]>3){
>unset($hoge_syutugen_hindo[3]);
>$hoge_syutugen_hindo[4]++;
>//もしくは$hoge_syutugen_hindo[4]=1;
>}
print_r($hoge_syutugen_hindo);
結果
Array ( [1] => 1 [2] => 1 [3] => 3 ) ;
以下の結果でした。
どうやら、if文が働かないみたいです。
わたしが思うに展開してキーと値に分けて、処理しないとできないような気がします。
展開せずに処理できる関数があればそれに越したことはありません。
reset($hoge_syutugen_hindo);
while(list($key, $value) = each($hoge_syutugen_hindo)) {
if($key==3 && $value>3){
$key=4;
$value=1;
}else{
$key;
$value;
}
のような展開して新しく配列を作成しなければいけないような----
わたしもこれから先どう配列化すれば良くはわからないのですが----
また、よろしくお願いします。
No.1
- 回答日時:
仕様が破たんしていませんか?
>$hoge_syutugen_hindoの結果で[3]の出現頻度が3回以上あったら、
>Array ( [1] => 1 [2] => 1 [3] => 3 ) を
>Array ( [1] => 1 [2] => 1 [4] => 1 ) に変更。
揚足をとるようで申し訳ないですが、仕様確定のため・・・
「[3]の出現頻度が3回以上」となっていますが
「Array ( [1] => 1 [2] => 1 [3] => 3 )」の時点ですでに3回以上ですね?
もし仮にこれが、4回以上だと読み替えたとしても、
Array ( [1] => 1 [2] => 1 [3] => 4(or more) )
ではなく、
Array ( [1] => 1 [2] => 1 [4] => 1 )
となる状況がわかりません
これがまかり通る場合、
Array(1,2,3,3,3,3)もArray(1,2,4)も同じになりますね?
仕様が競合していますがそれでよいのでしょうか?
Array(1,2,3,3,3,3,4)の場合は
Array ( [1] => 1 [2] => 1 [4] => 2 )
なのでしょうか、それとも他の値なのでしょうか?
またArray(1,2,3,3,3,3,3)の場合も
Array ( [1] => 1 [2] => 1 [5] => 1 )ではなくキーは4なのでしょうか?
早速の回答恐れ入ります。
>Array ( [1] => 1 [2] => 1 [4] => 1 )となる状況がわかりません
>これがまかり通る場合、
>Array(1,2,3,3,3,3)もArray(1,2,4)も同じになりますね?
>仕様が競合していますがそれでよいのでしょうか?
確かに仕様が競合していますが、それでいいです。
とにかく、3の動作だけは2回出現したらやめて、それ以降は4の動作にしたいのです。
4の動作は3の動作が3回以上のみ働く特別な動作であり、これ以外の動作はありません。5の動作はありません。
ですから、4の動作になったと分かればそれでいいので、[4] => 1でいいのです。
普通から考えれば、yambejp様のおしゃるとおり、おかしいと思うが当然ですが、今回はこの仕様でいいのです。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Visual Basic(VBA) 型が一致しませんとエラー 6 2023/07/06 20:14
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript 2段階プルダウンで1段階目の選択を終えた後に選択ボックスを見えなくしたい 2 2022/07/05 21:58
- JavaScript java keyを配列で表記したい 10 2022/12/01 17:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
forとかで連番の変数を一気に格...
-
スカラーのベクトル微分
-
PHPのmin関数、「1」以上の数値...
-
CArrayのソート
-
PHPは何故値渡しより参照渡しの...
-
pg_copy_fromの使い方について...
-
verilogで、配列の一部をタスク...
-
配列の要素(value)に、変数を...
-
多次元配列をソートする綺麗な...
-
System.String.Splitでエラー
-
foreachのなかで次のキーを参照...
-
$_SESSIONに二次元配列を使える...
-
listへのappendが出来ない件
-
3つの連想配列を交互に代入し...
-
String だと「 ByRef引数の型が...
-
smartyのforeachの使い方
-
$_SESSIONについて教えて下さい。
-
ネストが深い時のforeachはどう...
-
配列をMySQLの1カラムに入れ、...
-
別ファイルの構造体の値を読み...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スカラーのベクトル微分
-
特定の文からメールアドレスの...
-
読み(あ行~わ行)ごとに分け...
-
ファイルの書き込みについて教...
-
php で1から100までの素数の表...
-
配列の要素(value)に、変数を...
-
C言語の配列をPush(追加)する...
-
STLのvectorで作った配列をメン...
-
C言語 最大値と最小値を求めて...
-
行列
-
verilogで、配列の一部をタスク...
-
CArrayのソート
-
PHPのセレクトボックスの初期値...
-
Perlで重複行を削除したい
-
pythonのnumpyでの繰り返しでの...
-
System.String.Splitでエラー
-
連想配列から<th>を含むテーブ...
-
2次元配列CSVのソート
-
【PHP】配列のキー名の修正は可...
-
Pager::factory()の使い方がわ...
おすすめ情報