質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1342閲覧

配列シャッフルで特定の条件に該当するものは並びを変えたくない

asus2

総合スコア22

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/08/27 02:38

今までDBから得られた結果をshuffle関数で全てランダムに入れ替える処理を施していた部分に
新たに特定の条件に該当する場合はその範囲のみ入れ替え処理の対象としない処理を組み込む必要がでてきました。
(新たな条件→fugaに0以外の数字が格納されていた場合です。)

hogefuga
5814680
4813580
5879840
000010123456
000011123456
000012123456
8913570
3457840

fugaに0以外の数字が入っているものを抜き出してからshuffleし、また合体させる方法をためしてみましたが
これだと条件に該当するものはすべて初めのほうか終わりのほうに固定されてしまいます。
もっと良い方法はないでしょうか。ご教授いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

fugaが0でないものだけ抽出して、おなじ場所を選んでシャッフルするんですかね?

PHP

1$a=[ 2 ["hoge"=>1 ,"fuga"=>0], 3 ["hoge"=>2 ,"fuga"=>0], 4 ["hoge"=>3 ,"fuga"=>1], 5 ["hoge"=>4 ,"fuga"=>0], 6 ["hoge"=>5 ,"fuga"=>2], 7 ["hoge"=>6 ,"fuga"=>3], 8 ["hoge"=>7 ,"fuga"=>0], 9 ["hoge"=>8 ,"fuga"=>0], 10 ]; 11$b=array_filter($a,function($x){ 12 return $x["fuga"]===0; 13 // return $x["fuga"]!==0; 14}); 15/*0の部分だけシャッフルするなら演算子===を使う*/ 16$c=$d=array_keys($b); 17shuffle($d); 18foreach($d as $key=>$val){ 19 $a[$c[$key]]=$b[$val]; 20} 21print_r($a);

投稿2018/08/27 03:11

編集2018/08/27 03:21
yambejp

総合スコア114742

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asus2

2018/08/27 03:19

説明が足らずにすいません、 私の質問の表でいうところのfuga!=0、つまりhoge = 000010~000012の部分の並びは変えずに、 fuga ==0 の部分をランダムに入れ替えることを目指しています。
yambejp

2018/08/27 03:21

そういうことなら条件が逆ですね ソースを修正したので確認してみてください
asus2

2018/08/27 03:27

ありがとうございます! 条件にピッタリです。 勉強させていただきます。
guest

0

これだと条件に該当するものはすべて初めのほうか終わりのほうに固定されてしまいます。

元の位置を保ってマージすればいいのでは?

#コードサンプル
途中まで、yambejpさんのコードをもらいます。

PHP

1$a=[ 2 ["hoge"=>1 ,"fuga"=>0], 3 ["hoge"=>2 ,"fuga"=>0], 4 ["hoge"=>3 ,"fuga"=>1], 5 ["hoge"=>4 ,"fuga"=>0], 6 ["hoge"=>5 ,"fuga"=>2], 7 ["hoge"=>6 ,"fuga"=>3], 8 ["hoge"=>7 ,"fuga"=>0], 9 ["hoge"=>8 ,"fuga"=>0], 10 ]; 11$b=array_filter($a,function($x){ 12 return $x["fuga"]===0; 13}); 14shuffle($b); 15 16$bi=0; 17foreach($a as $ai => $val){ 18 if($val["fuga"]===0){ 19 $a[$ai] = $b[$bi]; 20 $bi++; 21 } 22}

投稿2018/08/27 02:42

編集2018/08/27 04:37
otn

総合スコア84489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asus2

2018/08/27 03:16

fuga != 0のものを抽出しているので全ての fuga!=0の値がひと塊になってしまいます。 元の位置、並びを保ったままマージする方法があるのでしょうか。 勉強が足らずすいません、もう少し詳しく教えていただけると嬉しいです。
otn

2018/08/27 04:33

ゼロから書くのは面倒だったのでコードは書きませんでした。 回答に追記しておきます。
asus2

2018/08/28 04:16

返信が遅れてしまい申し訳ありません。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問