人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP5の配列の質問です。

以下3つの多次元配列を、配列Dのようにする方法を知りたいです。
配列Dは日付で降順にソートします。


配列A
text01,text02,date
aaa,00a,2007-01-31 12:00:00
bbb,00b,2007-02-31 12:00:00

配列B
text01,text02,date
eee.00e,2007-05-31 12:00:00
fff,00f,2007-06-31 12:00:00

配列C
text01,text02,date
hhh,00h,2007-03-31 12:00:00
iii,00i,2007-04-31 12:00:00

合体した配列D
text01,text02,date
fff,00f,2007-06-31 12:00:00
eee.00e,2007-05-31 12:00:00
iii,00i,2007-04-31 12:00:00
hhh,00h,2007-03-31 12:00:00
bbb,00b,2007-02-31 12:00:00
aaa,00a,2007-01-31 12:00:00

よろしくお願いします。

●質問者: seadwell
●カテゴリ:ウェブ制作
✍キーワード:00 2007-01-31 2007-05-31 AAA FFF
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● minkpa
●0ポイント

http://q.hatena.ne.jp/1178209752

こちらに同様の質問と回答がありました。

◎質問者からの返答

チョット解りません。

まず、合体する方法がわかりません。

それに、SQLは使いませんし、ソートに関する記述も見当たりません。


2 ● GEN111
●50ポイント ベストアンサー

eee.00e,2007-05-31 12:00:00

ここの「eee」の後ろのピリオドはカンマに変えました。

$t[0] = 'text01,text02,date
aaa,00a,2007-01-31 12:00:00
bbb,00b,2007-02-31 12:00:00' ;

$t[1] = 'text01,text02,date
eee,00e,2007-05-31 12:00:00
fff,00f,2007-06-31 12:00:00' ;

$t[2] = 'text01,text02,date
hhh,00h,2007-03-31 12:00:00
iii,00i,2007-04-31 12:00:00' ;

foreach($t as $i => $v) {
 foreach($a[$i] = split("\n", $v) as $n => $c)
 $a[$i][$n] = split(',', $a[$i][$n]) ;
}

$D = array_merge($a[0], $a[1], $a[2]) ;
usort($D, 
 create_function(
 '$a, $b',
 'if ($a[2] == $b[2]) return 0 ;
 else return $a[2] < $b[2] ? 1 : -1 ;')) ;
array_shift($D) ; array_shift($D) ;

print_r($D) ;
◎質問者からの返答

ご指導ありがとうございます。

スイマセンm(_ _)m

誤字がありましたね^^;

まだ、よく解っていませんが早速試してみます。

お返事は、理解するまで少し遅くなるかもしれません。


3 ● y-kawaz
●50ポイント

こんな感じですかね。

  1. array_mergeで配列を合体させて
  2. usortで自前の比較関数cmp_by_dateを使ってソートしてます。
<?php
$a = array(
 array('aaa', '00a', '2007-01-31 12:00:00'),
 array('bbb', '00b', '2007-02-31 12:00:00')
);
$b = array(
 array('eee', '00e', '2007-05-31 12:00:00'),
 array('fff', '00f', '2007-06-31 12:00:00')
);
$c = array(
 array('hhh', '00h', '2007-03-31 12:00:00'),
 array('iii', '00i', '2007-04-31 12:00:00')
);

$d = array_merge($a, $b, $c);
usort($d, 'cmp_by_date');
print_r($d);

function cmp_by_date($v1, $v2) {
 return $v1[2] < $v2[2];
}
?>

↑の実行結果は↓

Array
(
 [0] => Array
 (
 [0] => fff
 [1] => 00f
 [2] => 2007-06-31 12:00:00
 )
 [1] => Array
 (
 [0] => eee
 [1] => 00e
 [2] => 2007-05-31 12:00:00
 )
 [2] => Array
 (
 [0] => iii
 [1] => 00i
 [2] => 2007-04-31 12:00:00
 )
 [3] => Array
 (
 [0] => hhh
 [1] => 00h
 [2] => 2007-03-31 12:00:00
 )
 [4] => Array
 (
 [0] => bbb
 [1] => 00b
 [2] => 2007-02-31 12:00:00
 )
 [5] => Array
 (
 [0] => aaa
 [1] => 00a
 [2] => 2007-01-31 12:00:00
 )
)
◎質問者からの返答

ご回答ありがとうございますm(_ _)m

いや?、全くこんなカンジです^^/

ズバリ答えを書いていただいていますが、私なりにいろいろ実験して、結果報告いたします。

ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ