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

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

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

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

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

Q&A

解決済

3回答

4736閲覧

PHPのshuffle関数を使って連想配列をランダムで表示させたい。

syosinnsyadesu

総合スコア7

PHP

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

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

0グッド

0クリップ

投稿2015/08/28 03:35

{
"array": [
{
"test1": 1,
"test2": 2,
"test3": 3,
"img_path": "img/img_name1.png"
},
{
"test1": 2,
"test2": 2,
"test3": 2,
"img_path": "img/img_name2.png"
}
]
}

上記の様な形式のjsonファイルをphpでデコードしてController側でshuffle関数を使いたいのですが

shuffle() expects parameter 1 to be array, null given in C:\~というエラーが出てしまいます。

指定の仕方が間違っていると思うのですが、どのように書いたらよろしいでしょうか?

現状このように書いてしまっています。 ↓

$img_path = shuffle($test_json_array['img_path']);

$test_jsonという変数名でデコードしています。

ご教授頂けましたら幸いです。

よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

もしかしたら参考になると思います。

参考URL

投稿2015/08/28 05:52

NIA

総合スコア181

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

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

0

PHP

1$img_path = shuffle($test_json['array'])[0]['img_path'];

では?

上記コードが正しいかは自信がありませんが、shuffle()は引数に配列を与えて使います。

PHP

1$img_path = shuffle($test_json_array['img_path']);

ではshuffle()に未定義の配列$test_json_arrayの「img_path」という名前の要素を渡しており、nullが入っています。

投稿2015/08/28 04:08

orange0190

総合スコア1698

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

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

Takanori

2015/08/28 05:41

ご回答ありがとうございます。 ご教授頂いた通りに $img_path = shuffle($test_json['array'][0]['img_path']); と記述すると下記のエラーが表示されます。 shuffle() expects parameter 1 to be array, string given in エラーの内容を調べてみると、関数に文字列を渡さなきゃいけないところに配列がある。 とのことみたいですが... 具体的に実現させたいことを申しますと ブラウザ上で表示している10個の画像を 会員がログインした時と非会員がログインした時をフラグ判定して 非会員がログインした時にはtest.jsonに記載しているpathから画像を ランダムに取得して表示したいのですがどのようにコードを書けばよろしいでしょうか? 重ねての質問になり、申し訳ありませんが、よろしくお願い致します。
hy3

2015/08/28 05:57

横からで申し訳ありませんが、Takanoriさんの実行したコードはShunsukeIzuiさんの回答と違っています。 正: $img_path = shuffle($test_json['array'])[0]['img_path']; 誤: $img_path = shuffle($test_json['array'][0]['img_path']);
guest

0

ベストアンサー

こういうことでしょうか?

php

1$shuffled_array = $test_json['array']; 2shuffle($shuffled_array); 3$img_path = $shuffled_array[0]['img_path'];

ただし、上記のように配列をランダムに並び替えるよりは次のように配列の添字の方を乱数化した方が効率が良いように思います。

php

1$index = rand(0, count($test_json['array']) - 1); 2$img_path = $test_json['array'][$index]['img_path'];

投稿2015/08/28 04:05

編集2015/08/28 05:51
hy3

総合スコア594

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

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

Takanori

2015/08/28 05:42

ご回答ありがとうございます。 具体的に実現させたいことを申しますと ブラウザ上で表示している10個の画像を 会員がログインした時と非会員がログインした時をフラグ判定して 非会員がログインした時にはtest.jsonに記載しているpathから画像を ランダムに取得して表示したいのですがどのようにコードを書けばよろしいでしょうか? 重ねての質問になり、申し訳ありませんが、よろしくお願い致します。
hy3

2015/08/28 05:55

非会員ログイン時のpathのランダム取得処理が質問の意図であるならば、私の回答にあるコードで動作するかと思いますがいかがでしょうか。 もし上手くいかない場合は、(もちろん私のコードが間違っている可能性はありますが、)JSONデコード結果を格納している$test_jsonの構造が私の想定と違っている可能性が高いです。 その場合は$test_jsonをvar_dumpした結果か、JSONデコードに使用したライブラリを教えていただけるとより有効な回答が出来るかと思います。
syosinnsyadesu

2015/08/28 06:52

Array (4) period_start => "2015年8月1日" period_end => "2015年8月31日" month => "8" result => Array (10) 0 => Array (11) test1 => 1 test2 => 100 test3=> "00001" test4 => "A" img_path => "img/img_name1.png" img_path2 => "img/img_name1.jpg" test5 => "http://~/" test6 => "あ" test7 => "1" test8 => "1" test9 => "い..." 1 => Array (11)~・・・ 要素名、値は変えてありますが、上記の様な形式になっておりまして resultの中でpathのカラムを追加してランダムで画像を表示させたいのは 7番目までになります。8~10番目にはpathのカラムを書いておらず Array (9)になっております。 teratailのアカウントがいつの間にか切り替わっておりまして アカウント名が混同してしまい、申し訳ありません。 よろしくお願い致します。
hy3

2015/08/28 07:09 編集

pathのカラムが無い要素を除外するとなると、下手に配列をシャッフルしてしまうと入り混じってしまって面倒なことになりそうです。 pathが設定されているのが「最初の7つの要素」で固定されているのであれば、やはり配列の添字の方を乱数にした方が上手く行くかと思います。 $index = rand(0, 6); $img_path = $test_json['result'][$index]['img_path'];
syosinnsyadesu

2015/08/28 08:05

ありがとうございます。エラーが出力されなくなりました。 これで、result以下のimg_pathの値をリロードする度にランダムで取得できるのでしょうか? 重ね重ね基本的な質問で大変申し訳ないのですが、 tpl側での呼び出し方をご教授頂いてもよろしいでしょうか。 現状下記の様な形で出力できていますが、あっていますでしょうか? <div>{$test_Json.result[0].img_path}</div>
hy3

2015/08/28 08:27

$test_json変数がassignされているならば文法上はその指定で合っていますが、resultの添字が0固定では画像がランダムになりません。 以下の様にして$img_pathをassignして、tplから呼び出すようにした方が良いのではないでしょうか。 ・PHP側(Smartyオブジェクトが$smarty変数に格納されているとします) $smarty->assign('img_path', $img_path); ・tpl側 <div>{$img_path}</div>
syosinnsyadesu

2015/08/28 09:04 編集

<div>{$test_Json.result.img_path}</div> ドットで区切って呼ぶのではなく新たにアサインしなければならないのですね。 ありがとうございます。 アサイン後tpl側で出力はできまして、pathもランダムになっている様なのですが 10個の画像全てが同じ画像に変わってしまいます。 先程ご教授頂きました $index = rand(0, 6); $img_path = $test_json['result'][$index]['img_path']; ↑こちらの箇所でカラムの番号をしていしなければならないのでしょうか? (訂正:↑$indexで番号指定していますので、できるはずですよね・・・すみません) ランダムには表示されるのですが全て同じ画像が表示されてしまいます。 1~7はリロードの度に違うpathから取得したいのですが 記述がどこか間違っていたのでしょうか・・・。 ご丁寧に何度もご教授頂いていますのに、申し訳ないです。
hy3

2015/08/28 10:23

ごめんなさい、画像は同時に1枚だけ表示させるのだと勝手に勘違いしていました! 随分遠回りをさせてしまいました・・・ その場合、添字を乱数にすると二回以上表示される画像が出てしまうのを防ぐのが面倒ですね・・・ であれば、1から7番目の配列だけを切り分けて、シャッフルした後残りの配列と結合してしまいましょう。 ・PHP側 $left_array = array_slice($test_json['result'], 0, 7); $right_array = array_slice($test_json['result'], 7, 3); shuffle($left_array); $result_array = array_merge($left_array, $right_array); $smarty->assign("result_array", $result_array); ・tpl側 <div>{$result_array[0].img_path}</div> tpl側は添字を0から9まで変化させつつ、10個のimg_pathを取得してみてください。 今日はもう時間が無く、これ以上の回答は難しそうです。申し訳ありません。
syosinnsyadesu

2015/08/31 03:31

hy3さんご回答頂いていましたのに、ご返信できていませんで申し訳ありませんでした。 結局jsonファイルにpathを書くのではなくController側に配列でpathを書き shuffle関数を使い7つのpathをランダムにtpl側に表示させる方法を 実装することに致しました。 $img_path = array( "img/img1.jpg", "img/img2.jpg", "img/img3.jpg", "img/img4.jpg", "img/img5.jpg", "img/img6.jpg", "img/img7.jpg", ); shuffle($img_path); ここで再度ご質問させて頂きたいのですが、tpl側で 1、メンバーの際は1~10のメンバー画像をそのまま表示する。 2、非メンバーの際は1~7の画像は上記記載の$img_path配列からランダムにpathを   取得して表示し、8~10の画像はメンバー画像を表示したい。   例    画像1:img/img1.jpg    画像2:img/img2.jpg    画像3:img/img3.jpg    画像4:img/img4.jpg    画像5:img/img5.jpg    画像6:img/img6.jpg    画像7:img/img7.jpg    画像8:メンバー画像    画像9:メンバー画像    画像10:メンバー画像 リロード↓    例    画像1:img/img2.jpg    画像2:img/img4.jpg    画像3:img/img6.jpg    画像4:img/img7.jpg    画像5:img/img1.jpg    画像6:img/img5.jpg    画像7:img/img3.jpg    画像8:メンバー画像    画像9:メンバー画像    画像10:メンバー画像 ※リロード毎に1~7の画像表示の順番が変わる 上記の様な状態を実装したいのですがどの様に書いたらよろしいでしょうか? 現状下記の様な状態で {if $Member} <div class="hoge"><img src="hoge/dummy_178x178.jpg" width="178" height="178" alt=""></div> ←メンバー時の画像1~10 {else} <div class="hoge"><img src="hoge/{$img_path[0]}" width="178" height="178" alt=""></div> ←非メンバー時の画像1~10全て同じものが表示されてしまう。(※ここで1~7は非メンバー画像、8~10はメンバー画像表示をしたい) {/if} {foreach from=$test_Json.result item=test name=lpname} 10個の画像は上記のforeach分で繰り返し処理をして表示しております。 以上の様な状況です。重ね重ね本当にお手数をお掛け致しまして、申し訳ありませんが よろしければ、ご教授頂けませんでしょうか。 何卒、よろしくお願い致します。
hy3

2015/08/31 04:10

そろそろキリがないので出来ればこれで終わりにするか、別途質問を立てるようにしてください。 同じ画像を表示してしまうのは$img_path[0]という風に、常に配列内の0番目の要素を取得しているのが原因です。 Smartyではforeach使用時のループ回数を取得できるので、配列の添字に使用すると良いと思います。 例えば今回の例ならば、以下の様にすると切り替わるかと思います。 $img_path[$smarty.foreach.lpname.iteration]
syosinnsyadesu

2015/08/31 04:44

質問内容が当初と変わってしまいまして申し訳ありません。 何度もご教授頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問