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

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

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

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

Q&A

解決済

1回答

1109閲覧

任意の順番で変数を取り出す方法

msx2

総合スコア174

PHP

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

0グッド

0クリップ

投稿2016/10/04 06:26

PHPです。
下記の様な配列にデータを格納していき、任意の順番に取り出す処理を考えています。

PHP

1$image['priority_a']['type_a'] = []; 2$image['priority_a']['type_b'] = []; 3$image['priority_b']['type_a'] = []; 4$image['priority_b']['type_b'] = [];

データは格納した順番に取り出せればよく、任意の順番にしたいのは4つの配列の順番です。

とりあえず現状は参照を別の配列に格納する方法で実現しています。

PHP

1//好きな順番をここで設定 2$order[] = &$image['priority_a']['type_a'] 3$order[] = &$image['priority_b']['type_a'] 4$order[] = &$image['priority_a']['type_b'] 5$order[] = &$image['priority_b']['type_b'] 6 7//その後・・ 8foreach($order as $img){ 9 //なにかしらの処理 10 $img['xxx'] = xxxx; 11}

PHPについて調べても参照というものが使われている例があまりなく、もしかして使わない方がいいのかと心配しています。

処理は期待通りに動いていますが、何かバグが潜んでいたりするのでしょうか?($orderはデータの取り出しにしか使いません)

また、参照を使わないクールな方法があれば教えていただきたいです。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

参照代入でなければならないのは,以下の2つが両方満たされる場合です.

  • データの入れ物が参照型ではなく値型である
  • 代入した後に,元の変数に対して行った変更が,代入先の変数にも反映されてほしい

php

1$image = [ 2 'priority_b' => [ 3 'type_b' => [], 4 'type_a' => [], 5 ], 6 'priority_a' => [ 7 'type_a' => [], 8 'type_b' => [], 9 ], 10]; 11 12$order = [ 13 &$image['priority_a']['type_a'], 14 &$image['priority_b']['type_a'], 15 &$image['priority_a']['type_b'], 16 &$image['priority_b']['type_b'], 17]; 18 19$image['priority_a']['type_b'][] = 'something'; 20 21// ここでsomethingの追加が反映されている 22var_dump($order);

データが**参照型(オブジェクト)**である場合には,参照代入する必要はありません.参照代入は難解になりやすいので,こちらのほうがおすすめです.

php

1$image = [ 2 'priority_b' => [ 3 'type_b' => (object)[], 4 'type_a' => (object)[], 5 ], 6 'priority_a' => [ 7 'type_a' => new stdClass, // 初期化時点でセットしたい値が無ければ (object)[] はこれと同じ意味 8 'type_b' => new stdClass, 9 ], 10]; 11 12$order = [ 13 $image['priority_a']['type_a'], 14 $image['priority_b']['type_a'], 15 $image['priority_a']['type_b'], 16 $image['priority_b']['type_b'], 17]; 18 19$image['priority_a']['type_b']->foo = 'bar'; 20 21// ここでbarの追加が反映されている 22var_dump($order);

<値型>と<参照型>、<値渡し>と<参照渡し>について実行例を出す(PHP編) - Qiita

また,少し回答の範囲を超えますが,場合によってはSplPriorityQueueも役に立つかもしれません.データの持ち方を変える必要はありますが…

投稿2016/10/04 06:42

編集2016/10/04 06:57
mpyw

総合スコア5223

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

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

mpyw

2016/10/04 06:46

(「どこを連想配列にしてどこをオブジェクトにすべきか」については,状況やプログラマのセンス次第で答えが変わってきます…)
msx2

2016/10/04 13:49

ご回答ありがとうございます! 変数が値型か参照型かなんて考えたことはありませんでした。 今回のケースだと配列への代入は一番最初に行い、その後に元のデータに追加していくので参照代入を使うのは間違いではないのですね。 ただ参照代入を避けるためにオブジェクトを使うなどの工夫はあってもいい訳で、参照代入を使わない方法も検討してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問