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

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

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

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

Q&A

解決済

1回答

4116閲覧

多次元配列の下の層の要素を入れ替えたい(下の層の要素に対して操作をしたい)

light

総合スコア17

PHP

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

0グッド

1クリップ

投稿2015/01/24 09:42

やりたいことは

lang

1$array = array( 2 array( 3 array("one" => "A1", "two" => "A2", "three" => "A3"), 4 array("one" => "B1", "two" => "B2", "three" => "B3"), 5 array("one" => "C1", "two" => "C2", "three" => "C3"), 6 ), 7 ); 8とあるのを 9$array = array( 10 array( 11 array("two" => "A2", "one" => "A1", "three" => "A3"), 12 array("two" => "B2", "one" => "B1", "three" => "B3"), 13 array("two" => "C2", "one" => "C1", "three" => "C3"), 14 ), 15 );

とすることです。
(無駄に多次元になってますが仕様です。)

やりかたとして
・foreachで下の階層に対して操作する
・array_sliceでキーが"two"の箇所を取得する
・unsetでキーが"two"の箇所を削除する
・array_unshiftで上記のarray_sliceで取得したものを先頭に追加する
というのを考えました。
これを実装して

lang

1<?php 2$array = array( 3 array( 4 array("one" => "A1", "two" => "A2", "three" => "A3"), 5 array("one" => "B1", "two" => "B2", "three" => "B3"), 6 array("one" => "C1", "two" => "C2", "three" => "C3"), 7 ), 8 ); 9 10echo "<pre>"; 11var_dump($array); 12foreach ( $array as $valueA ) { 13 foreach ( $valueA as $valueB ) { 14 $get_two = array_slice($valueB, 1, 1); 15 var_dump($get_two); 16 17 unset($valueB["two"]); 18 var_dump($valueB); 19 20 array_unshift($valueB, $get_two["two"]); 21 var_dump($valueB); 22 } 23} 24var_dump($array); 25echo "</pre>"; 26?>

としました。

ここで問題なのは
・foreachで下の階層に対して操作を行っても、もとの$arrayは変わっていないこと
・array_unshiftでは値は追加できてもキーが追加できないこと
です。

これらを解決する方法がありましたら教えてください。
また、こんな回りくどいことをしなくても意図した結果が得られる方法があれば教えてください。

よろしくお願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー

foreachで回すときにイテレータ変数の頭に&をつけてリファレンスにすれば要素そのものを操作したことになります。但し、ループ脱出後にunsetするのを忘れないでください。PHPのforeachにはブロックスコープが存在しないので、リファレンスを解除し忘れると次にその変数名が登場したときに最後の要素を破壊してしまいます。

lang

1foreach ($array[0] as &$row) { 2 $row = array_merge(array_splice($row, 1, 1), $row); 3} 4unset($row);

もしくはキーで指定するのもアリです。

lang

1foreach ($array[0] as $i => $_) { 2 $array[0][$i] = array_merge(array_splice($array[0][$i], 1, 1), $array[0][$i]); 3}

ファンクショナルに書くのもアリです。

lang

1$array[0] = array_map( 2 function ($row) { return array_merge(array_splice($row, 1, 1), $row); }, 3 $array[0] 4);

投稿2015/01/24 21:53

mpyw

総合スコア5223

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

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

light

2015/02/01 09:14

遅くなりましたが、おかげさまで希望の動作を実現することができました。ありがとうございます。 ちなみにこういった知識はどういうところで得ているのでしょうか。基本的なことでしたでしょうか。
mpyw

2015/02/06 05:12

うーん分からなければググってマニュアルチェックしたり時にはブログ記事参考にしたりいろいろですね。そういったことの積み重ねです。何気にPHP歴は結構長いので…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問