PHP多次元配列のソート方法とstrcmp関数の違い
- PHPで多次元配列をソートする方法について解説します。nameキーでのソートとaddressキーでのソートの2つの例を紹介します。
- nameキーでのソートにはusort関数を利用し、比較関数を自分で定義する方法を使用します。addressキーでのソートにも同じ方法を適用します。
- しかし、addressキーでのソートにstrcmp関数を用いる場合、うまくソートできないことがあります。これは、strcmp関数がバイナリセーフな文字列比較を行っているためです。
- ベストアンサー
PHP 多次元配列のソート
$array = array( array("address" =>"eeee@dddd.ddd","name" => "あいう"), array("name" => "はざま","address" => "cccc@dddd.ddd"), array("name" => "かきく","address" => "tttt@ccc.eee"), array("name" => "さく","address" => "bbbb@dddd.ddd"), array("name" => "あか","address" => "aaaa@dddd.ddd") ); 上記のような多次元配列があった場合 sort($array); とすると 以下のようなデフォルトの配置が Array ( [0] => Array ( [address] => eeee@dddd.ddd [name] => あいう ) [1] => Array ( [name] => はざま [address] => cccc@dddd.ddd ) [2] => Array ( [name] => かきく [address] => tttt@ccc.eee ) [3] => Array ( [name] => さく [address] => bbbb@dddd.ddd ) [4] => Array ( [name] => あか [address] => aaaa@dddd.ddd ) ) 上記の並びが Array ( [0] => Array ( [address] => eeee@dddd.ddd [name] => あいう ) [1] => Array ( [name] => あか [address] => aaaa@dddd.ddd ) [2] => Array ( [name] => かきく [address] => tttt@ccc.eee ) [3] => Array ( [name] => さく [address] => bbbb@dddd.ddd ) [4] => Array ( [name] => はざま [address] => cccc@dddd.ddd ) ) nameキーの値をもとにあいうえお順にならびかえられます。 がこれをnameキーではなく addressキーで並び替えたいと思ったとき、 usort($array , function($a,$b){ if($a["address"]< $b["address"]){ return -1; }else{ return 1; } } ); と上記のようのおこなうと Array ( [0] => Array ( [name] => あか [address] => aaaa@dddd.ddd ) [1] => Array ( [name] => さく [address] => bbbb@dddd.ddd ) [2] => Array ( [name] => はざま [address] => cccc@dddd.ddd ) [3] => Array ( [address] => eeee@dddd.ddd [name] => あいう ) [4] => Array ( [name] => かきく [address] => tttt@ccc.eee ) ) とうまくaddressキーでabcdの順にソートできています。 次に usort($array , function($a,$b){ return strcmp($a["address"],$b["address"])? -1:1; } ); と上記のようにstrcmp関数を使うと Array ( [0] => Array ( [name] => あか [address] => aaaa@dddd.ddd ) [1] => Array ( [name] => さく [address] => bbbb@dddd.ddd ) [2] => Array ( [name] => かきく [address] => tttt@ccc.eee ) [3] => Array ( [name] => はざま [address] => cccc@dddd.ddd ) [4] => Array ( [address] => eeee@dddd.ddd [name] => あいう ) ) うまくソートできませんでした。 この、直接 $a, $bの大小を条件とした場合と strcmp — バイナリセーフな文字列比較をおこなうstrcmp とは、どのような処理の違いがあるのでしょうか?
- 1000vicki
- お礼率17% (40/226)
- PHP
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
foreach($array as $key => $row){ $data[$key] = $row["name"]; } array_multisort($data,SORT_DESC,$array); 多次元配列用のソートが存在しますよ
関連するQ&A
- SQLの書き方について教えてください。
accessについて。 シートの中に列名name、列名friendnameがあります。 name,friendname aaaa,bbbb bbbb,cccc cccc,aaaa dddd,aaaa eeee,bbbb ffff,eeee ほしいデータは aaaa,bbbb,cccc bbbb,cccc,aaaa cccc,aaaa,bbbb dddd,aaaa,bbbb eeee,bbbb,cccc ffff,eeee,bbbb と友達の友達の名前がほしいのです。 SQLの書き方を教えてください。 よろしくお願いします。
- ベストアンサー
- その他(データベース)
- アクセスログから同時ログイン数を割り出す手法
以下のようにアクセスログが出力されるものがあります。 このログより、ユーザがログインした時点で他に何ユーザログイン しているかを集計する方法を模索しています。 何か良い方法ありますでしょうか。 *************************** user,login,logout aaaa,095703775,100825968 bbbb,095709415,095809695 cccc,095732774,095733633 bbbb,095734883,095735227 aaaa,095735321,095735727 dddd,095742555,095743680 eeee,095742664,095743102 gggg,095743196,095743664 tttt,095801070,095804070 *************************** ・userはログインしたユーザ名、login、logoutはHHMMSSmmm形式で時刻を出力します。 ・各ユーザはloginからlogoutまでの間ログインした状態です。 出力結果としては以下のようなイメージです。 *************************************** user,login,logout,実行ユーザ数 aaaa,095703775,100825968,0 bbbb,095709415,095809695,1 cccc,095732774,095733633,2 bbbb,095734883,095735227,2 aaaa,095735321,095735727,3 dddd,095742555,095743680,2 eeee,095742664,095743102,3 gggg,095743196,095743664,3 tttt,095801070,095804070,2 *************************************** 以上です
- 締切済み
- その他(ITシステム運用・管理)
- SQLでの集計
下記の様に、「複数のitemを買っているuserと購入されたitem」のテーブルと、 user item ---------------------------------- 田中 AAAA 田中 CCCC 田中 EEEE 北野 DDDD 北野 BBBB 北野 AAAA 小堺 CCCC 小堺 EEEE 松本 EEEE 松本 KKKK 松本 CCCC 松本 DDDD 浜田 BBBB 浜田 DDDD 下記の様な IDに紐付いた 「item」のテーブルから、 ID item ---------------------------------- 1 AAAA 2 BBBB 3 CCCC 4 DDDD 5 EEEE 下記の様に各itemと各itemを買った場合に一緒に買われるitemの一覧を結果 として表示させたいのですが、クエリの作り方が思い浮かばず、困っています。 ※)可能であれば、買われたitemを表示する際にはbuy1から(左側から)同時購入 回数の多いitemを重複せずに並べて表示したい ID item buy1 buy3 buy4 buy5 buy6・・・・ ---------------------------------- 1 AAAA CCCC BBBB DDDD EEEE 2 BBBB DDDD AAAA 3 CCCC AAAA EEEE DDDD KKKKK 4 DDDD AAAA BBBB CCCC EEEE 5 EEEE AAAA CCCC KKKKK 尚、IDと紐付いているitem数は決まっていますが、買われるitemの種類は上記 の様にIDが1~5だけではなく、集計してみないと判らない状況です。 今の所、SQLはACCESS(2003)上にて手打ちしています。 以上、ご教示のほど、宜しくお願い致します。
- ベストアンサー
- その他(データベース)
- UNIXで文字列分割
UNIXでマルチバイトの文字列で分割したいです。 例) aaaa bbbb cccc dddd eeee ffff ↓ [bbbb]で分割 [1]aaaa [2] cccc dddd eeee ffff できればawkで処理をしたいと考えています。
- ベストアンサー
- その他(プログラミング・開発)
- Access Union について
下記2テーブルがあります。 テーブル1 品番 1月合計 AAAA 1111 BBBB 2222 CCCC 1122 EEEE 3211 テーブル2 品番 2月合計 AAAA 1211 BBBB 3222 CCCC 1522 DDDD 2223 UNIONのSQL文で下記のような結果を得たいです。 品番 1月合計 2月合計 AAAA 1111 1211 BBBB 2222 3222 CCCC 1122 1522 DDDD 2223 EEEE 3211 SQL文をどのように書いたらいいですか。ご教授,お願い致します。
- 締切済み
- オフィス系ソフト
- wordの段落を通番で振りなおしたい
word2003で段落を設定した文書があるんですが、番号を振りなおしてつけているため、以下のようになっております。 1.aaaa 2.bbbb 3.cccc 1.dddd 2.eeee 1.ffff 2.gggg 3.hhhh これを以下のような通しの段落番号に変換することは可能でしょうか? 1.aaaa 2.bbbb 3.cccc 4.dddd 5.eeee 6.ffff 7.gggg 8.hhhh 各段落の1.を”自動的に番号を振る”を選択すればできると思いますが、数が多いため簡単な方法を探しております。 よろしくお願いいたします。
- ベストアンサー
- オフィス系ソフト
- エクセルで教えて下さい。
エクセルで教えて下さい。 オートフィルタ、ピボットテーブル以外で関数などで教えて下さい。 A列に大量の文字列があり重複したりしてます。 そこで、 B列にはA列にある大量の文字列を重複なしで表示させたいと思ってます。 例えば A列 B列 AAAA AAAA BBBB BBBB AAAA CCCC CCCC DDDD DDDD EEEE DDDD FFFF EEEE FFFF EEEE AAAA みたいな感じです。A列は編集可能でQQQQを追加すれば自動でB列にも表示させたいです。 このようなことを簡単にできますでしょうか? 宜しくお願いします。
- ベストアンサー
- その他MS Office製品
- エクセルについての質問。
エクセルの関数に関して質問があります。 |10001|AAAA|10002|BBBB| |10002|BBBB|10004|DDDD| |10003|CCCC|10004|DDDD| |10004|DDDD|10001|AAAA| |10005|EEEE|10005|EEEE| ちょっと分かりにくいですが 一番上の行ですと、 列A=10001 列B=AAAA 列C=10002 列D=BBBB と考えて下さい。 質問です。 --------------------------- 列Cの数値を列Aから検索して 同じのがあれば列Bの数値を列Dに表示する。 --------------------------- この関数を教えて頂けませんでしょうか? 宜しくお願い致します。
- 締切済み
- その他MS Office製品
- access で 方法を教えてください。
access で 方法を教えてください。 テーブルは セミコロン区切りで、区切られて表示されています (テーブル例) 1 aaaa;bbbb;cccc;dddd;eeee;ffff 2000byte 2 aaaa 300byte 3 bbbb;cccc;ffff 3000byte 4 ffff;dddd 120byte このセミコロン区切りの区切られたデータの 「件数」と「バイト」を表で表示させる方法を教えて欲しいのです。 上記テーブル例を使用しての(抽出例) 抽出条件 ↓ aaaa 2件 2500byte bbbb 2件 5000byte cccc 2件 5000byte dddd 2件 2120byte eeee 1件 2000byte ffff 3件 5120byte 宜しくお願いします。
- ベストアンサー
- オフィス系ソフト
- 配列の値を一行あけて出力
配列の値を一行あけて出力したいのですが、うまくいきません。 ご教授お願いいたします。 <shell> #!/bin/bash ARRAY=("aaaa" "bbbb" "cccc") IFS=$'¥n'$'¥n' echo "${ARRAY[*]}" <現在の出力> aaaa bbbb cccc <期待する出力> aaaa bbbb cccc
- 締切済み
- Linux系OS
お礼
おお、そんな関数が!ありがとうござます