• 締切済み

多次元配列の並び変えについて

<?php $food["a"]["1"]= "hoge1"; $food["b"]["2"]= "hoge2"; $food["c"]["3"]= "hoge3"; $food["d"]["4"]= "hoge4"; ?> 上記の配列について、1,2,3,4のキーの順番でソートしたいのですが、うまく出来ません。 一次元配列だと簡単なのですが、二次元配列だとどうやったらよいのでしょうか? array_multisortを使うと、多次元でも並び変えはできると他のサイトで読みましたが、 これは結局値でソートしてますよね? 私は純粋にキーのみでソートしたいのですが、色々調べているのですがどうも複雑なプログラムを 書かないとできないような気がしてきました。

  • PHP
  • 回答数1
  • ありがとう数1

みんなの回答

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

各要素の配列(内側の配列)は要素数が1と決まっていると考えてよいでしょうか? 言い換えると ・ $food["a"]["1"] と $food["a"]["2"] が同時に存在することは無い。 ・ $food["a"] はどんな場合も要素の数が1。 が成り立つのでしょうか? もしそうであれば、 uasort を使ってソートすればよいでしょう。 例) ------------------------------------ <?php function cmp($a, $b) { $avals = array_keys($a); $bvals = array_keys($b); if ($avals[0] == $bvals[0]) return 0; return ($avals[0] < $bvals[0]) ? -1 : 1; } $food["d"]["4"]= "hoge2"; $food["c"]["3"]= "hoge4"; $food["b"]["2"]= "hoge1"; $food["a"]["1"]= "hoge3"; print_r($food); // ソート前 uasort($food, 'cmp'); print_r($food); // ソート後 ?>

参考URL:
http://www.php.net/manual/ja/function.uasort.php
cinnron
質問者

お礼

ご回答ありがとうございます。残念ながら要素数の数は1とは決まっておらずこのプログラムは使えません・・。

関連するQ&A

  • 多次元配列から任意の配列を取り出す

    すいません。phpを初めて勉強中なのですが、少し分からない事があります。 例えば以下のような二次元配列なのですが、私がやりたい事は「キーを使った並び替え」と 「特定のキーの排除」を行い、任意の順番でテキストを展開させたいです。 foreachで回して配列をソートし3つのテキストを展開するまではできたのですが、 キーが「y」となっている配列のみを抜き出すというのがどうすれば良いのでしょう? いろいろサイトを見てるのですが、特定のキーが入っている配列を抜き出す(または排除) というのは無く、値を抜き出すなどしかありません・・。 $food["1"]["y"]= "aaa1.txt"; $food["2"]["e"]= "aaa2.txt"; $food["3"]["y"]= "aaa3.txt"; $food["4"]["y"]= "aaa4.txt"; ↓ $food["1"]["y"]= "aaa1.txt"; $food["3"]["y"]= "aaa3.txt"; $food["4"]["y"]= "aaa4.txt";

    • ベストアンサー
    • PHP
  • 多次元配列でキーを基準に並び変えする

    すいません。多次元配列でキーを基準に並び変えを行いたいのですが、解説サイトやここでの質問で も解決せず困っています。以下が実際の配列で四次元目の2012010101~2012010107の数字を昇順、 降順で並び変え、k1~k4の値を結果として表示したいのですが、phpでは不可能なのでしょうか? 散々調べましたが、多次元配列の値で並び替えるというのは見つけたのですが、私が行いたいのは あくまでキーの数字で並び変えです。 詳しい方いましたらアドバイスいただければ助かります $food["y"]["bi"]["1"]["2012010101"]= "k1"; $food["y"]["ko"]["2"]["2012010104"]= "k2"; $food["n"]["dou"]["3"]["2012010105"]= "k3"; $food["y"]["dou"]["4"]["2012010106"]= "k4"; $food["n"]["bi"]["5"]["2012010107"]= "k5";

    • ベストアンサー
    • PHP
  • 2次元配列を多次元配列にする。

    2次元配列を多次元配列にする。 PHP5で 2次元目はすべて同じキーの2次元配列を 2次元目のキーごとの内容を共通項にまとめて、 多次元配列にする方法を教えてください。 キーの数は膨大なので、関数の再帰呼び出し で、きれいに処理したいのです。 説明文では説明しきれないので、 やりたいことは↓の通りです。 array[0] = array([one] => "あ", [twe] => "う" [three] => "き"); array[1] = array([one] => "あ", [twe] => "う" [three] => "く"); array[2] = array([one] => "あ", [twe] => "え" [three] => "け"); array[3] = array([one] => "あ", [twe] => "え" [three] => "こ"); array[4] = array([one] => "い", [twe] => "お" [three] => "さ"); array[5] = array([one] => "い", [twe] => "お" [three] => "し"); array[6] = array([one] => "い", [twe] => "か" [three] => "す"); array[7] = array([one] => "い", [twe] => "か" [three] => "せ"); という配列があったら、これを↓のようにしたいです。 array( [あ] => array( [う] => array ("き", "く") [え] => array ("け", "こ") ) [い] => array( [お] => array ("さ", "し") [か] => array ("す", "せ") )   ) どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 連想配列を array_multisort() でphp4、php5の違い

    いつもお世話になります。 連想配列をarray_multisort()でソートしようとしています。 php5のサーバでは思うように動作するのですが、 php4のサーバでは、ソートされません。 print_r($ary); Array ( [BuID] => 11 [BuName] => aaaa [yymmdd] => 080507 [DateDisp] => 08年05月07日(水) [DateType] => 1210086000 [TaikaiName] => AAAA [HRef] => [AnkName] => ) Array ( [BuID] => 12 [BuName] => bbbb [yymmdd] => 080822 [DateDisp] => 08年08月22日(金) [DateType] => 1219330800 [TaikaiName] => BBBBBBBB [HRef] => [AnkName] => ) ・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・ の様な連想配列をyymmddでソートしようとしています。 php5.2.6だと、 foreach($ary as $key => $row){ $yymmdd[$key] = $row['yymmdd']; } array_multisort($yymmdd,SORT_DESC,$ary); で、$aryにyymmddで並び替えられた配列が入ります。 しかし、php4.2.2では、ソートされず、もとの配列がそのまま$aryに入ってしまいます。 array_multisort()は、phpのバージョンによって動作が異なるような記載もありません。 どなたかわかる方見えましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 2次元配列 ソート

    はじめまして。 FLASH8を使っています。 2次元配列のソートがうまくいかず困っています。 Array[0][0] = "かかか"; Array[0][1] = "ききき"; Array[0][2] = "くくく"; Array[1][0] = "あああ"; Array[1][1] = "いいい"; Array[1][2] = "ううう"; とあって2番目の要素(「ききき」「いいい」の部分です)をキーとしてArray[n]を昇順にソートしたいのです。 この場合結果としては、 Array[0][0] = "あああ"; Array[0][1] = "いいい"; Array[0][2] = "ううう"; Array[1][0] = "かかか"; Array[1][1] = "ききき"; Array[1][2] = "くくく"; となります。 ご存知の方がいらっしゃいましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • 2次元配列の並び替え

    2次元配列の並び替えをやりたいのですが、どうすればわかりません。 int[][] list = new int[2][5]; の中身が list[0][0]=0; list[1][0]=4; list[0][1]=1; list[1][1]=1; list[0][2]=2; list[1][2]=3; list[0][3]=3; list[1][3]=2; list[0][4]=4; list[1][4]=0; だったとすると、list[0][ ]についてソートされていますが、 これをlist[1][ ]についてソートしたいのです。 つまり、 newlist[0][0]=4; newlist[1][0]=0; newlist[0][1]=1; newlist[1][1]=1; newlist[0][2]=3; newlist[1][2]=2; newlist[0][3]=2; newlist[1][3]=3; newlist[0][4]=0; newlist[1][4]=4; のようにlist[1][ ]についてソートしたいのですが、どうすればいいでしょうか? 教えてください。お願いします。

    • ベストアンサー
    • Java
  • 2次元配列CSVのソート

    2次元配列で次のCSVファイルがあります。 フォームから入力したのですが、txtファイルには項目名(列名)が保存されていません。 taro,10,119 jiro,10,90 hanako,9,120 momoko,11,98 saburo,12,111 natuyo,10,130 sirou,8,88 このデータを年齢順、及び身長順に並べ替えをしたいのです。 列の名前がないので、手動でtxtファイル1行目に simei,toshi,shinchou と追記して 01: <?php 02: $data = "c:\××\××\shinchou.txt"; 03: $array = file($data); 04: foreach($array as $key => $row){ 05: $toshi[$key] = $row["toshi"]; 06: $shinchou[$key] = $row["shinchou "]; 07: } 08: print_r($array); 09: array_multisort($toshi,SORT_ASC, $shinchou,SORT_ASC, $array); 10: ?> と実行しましたが、 Array ( [0] => simei,toshi,shinchou  [1] => taro,10,119 ・・・・と、print_r($array)の結果が出るだけで、ソートが出来ません。 CSVファイルで項目名(列名)が無い場合の並べ替えはどのようにすれば良いでしょうか。 mySQLなどを利用しないと並べ替えは出来ないでしょうか。

    • ベストアンサー
    • PHP
  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • foreachで多次元配列にしたくないのですが……

    foreachで多次元配列にしたくないのですが、多次元配列になってしまいます。 なぜでしょうか? ■$hoge Array (  [0] => 3  [1] => 9 ) ■処理 foreach ($hoge as $val){  $result[]= 関数($val); } ■期待している結果 Array (   [0] => Array     (       [id] => 1       [created_at] => 2013-08-01     )   [1] => Array     (       [id] => 2       [created_at] => 2013-08-02     ) ) ■実際の結果 Array (   [0] => Array     (       [0] => Array          (            [id] => 1            [created_at] => 2013-08-01          )     )   [1] => Array     (       [0] => Array          (            [id] => 2            [created_at] => 2013-08-02          )     ) )

    • ベストアンサー
    • PHP
  • 2次元配列のソート

    2次元配列のデータをソートしたいのですが方法がわかりません。初歩的な質問ですが、ご存知の方、よろしくお願いいたします。 (例) 商品コード、商品名、金額、有効期限のデータを以下のように持っています。 $data[0] = ("001", "商品A", 5200, "2004/5"); $data[1] = ("002", "商品B", 350, "2005/1"); $data[2] = ("003", "商品C", 10800, "2004/3"); ・・・・ データの項目(商品コード、商品名など)数は固定ですが、データ数、内容は変化します。 2次元配列でデータがあり、商品コードで降順にソート、金額で昇順にソートなどのソートを行う方法はありますか? No.760468 で同じような質問があり、array_multisort が回答としてあがっていましたが、上記データの場合ソートできないようなので質問させていただきました。 なお、環境によりデータベースを使用することはできません。

    • ベストアンサー
    • PHP

専門家に質問してみよう