配列の日付ソート方法とは?

このQ&Aのポイント
  • PHPで配列の日付ソート処理を行いたい場合、バブルソートなどの作成が必要です。
  • 配列の日付ソート処理で最初の配列の添え字を取得する方法はありますか?
  • 今回の質問ではksortを使用して日付ソートしましたが、うまく昇順されませんでした。他の方法を教えてください。
回答を見る
  • ベストアンサー

配列の日付ソート処理2

先ほど下記のような質問をしたのですが、、、 最初の配列の添え字を取得したい場合はどのようにしたらいいのでしょうか?? ksort($up_date, "cmp"); while (list ($key, $value) = each ($up_date)) { echo "$key: $value\n"; } function cmp ($a, $b) { if ($a == $b) return 0; return ($a > $b) ? -1 : 1; } としても、日付がうまく昇順されません。 この方法では駄目なのでしょうか?? ******************************************* 配列に下記のような日付が入ってます。 $array[0]=2004-11-01 14:20:10.412761+09; $array[1]=2004-11-28 19:09:42.898169+09; $array[2]=2004-11-26 17:16:10.531744+09; $array[3]=2004-11-30 20:25:39.622259+09; これをもっとも新しい日付の順序にしたいのですが、 これはやはり、バブルソートなどを作成する必要がでてきますでしょうか??? *********************************************

  • PHP
  • 回答数4
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • kusukusu
  • ベストアンサー率38% (141/363)
回答No.4

ようは日付の降順にソートしたいんですよね? ちょっとは自分でも考えましょう。 下記比較関数の ($p1[1]-$p2[1]) ココを適当に数字に直して比較してみてください。 簡単な例を挙げれば、もし日付だけでいいなら explode("\s",$p1[1])-explode("\s",$p2[1]) みたいに。 時間まで比較したいときは、面倒なので自分で考えてください(笑)

aiurai54
質問者

お礼

すみません。降順にソートするのは単純にrsortでやるとできました。 上記の関数を作って考えてみたいと思います。 長々とありがとうございます。

その他の回答 (3)

  • kusukusu
  • ベストアンサー率38% (141/363)
回答No.3

$array[0]="2004-11-01 14:20:10.412761+09"; $array[1]="2004-11-28 19:09:42.898169+09"; $array[2]="2004-11-26 17:16:10.531744+09"; $array[3]="2004-11-30 20:25:39.622259+09"; function sort_by_day($p1,$p2) { return($p1[1]-$p2[1]); } usort($array,"sort_by_day"); print_r($array);

  • kusukusu
  • ベストアンサー率38% (141/363)
回答No.2

function sort_by_day($p1,$p2) { return($p1[1]-$p2[1]); } usort($array,"sort_by_day"); 上記のような関数を作って usortすればうまくいくと思いますよ。

aiurai54
質問者

補足

教えていただいた方法でやってみたのですが、 どのような結果になるのが正しいのでしょうか? 下記のようなエコー文を追加したときに 日付の順番も添え字も0から始まってしまいました。 while (list ($key, $value) = each ($up_date)) { echo "$key: $value\n"; }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>最初の配列の添え字 例からすると、0じゃないの? >"cmp" 2番目の引数は、ソートフラグです。 参考URLをご覧下さい。 比較関数を利用するのは、 usortまたはuksortです 多分、 rsort($array)の後に reset($array)が必要という意味だと思います。

参考URL:
http://jp2.php.net/manual/ja/function.sort.php,http://jp2.php.net/manual/ja/function.uksort.php
aiurai54
質問者

補足

$array[0]=2004-11-01 14:20:10.412761+09; $array[1]=2004-11-28 19:09:42.898169+09; $array[2]=2004-11-26 17:16:10.531744+09; $array[3]=2004-11-30 20:25:39.622259+09; 最初は上記のような配列になっていると思うのですが、 rsortで並び変えた後は $array[3]=2004-11-30 20:25:39.622259+09; $array[1]=2004-11-28 19:09:42.898169+09; $array[2]=2004-11-26 17:16:10.531744+09; $array[0]=2004-11-01 14:20:10.412761+09; になっていると思います。ただ、rsortで並びかえると $array[0]=2004-11-30 20:25:39.622259+09; $array[1]=2004-11-28 19:09:42.898169+09; $array[2]=2004-11-26 17:16:10.531744+09; $array[3]=2004-11-01 14:20:10.412761+09; となってしまいます。最初の並びかえる前の配列の添え字を取得したいのです。 $array[3] $array[1] $array[2] $array[0]

関連するQ&A

  • 配列の日付ソート処理

    配列に下記のような日付が入ってます。 $array[0]=2004-11-01 14:20:10.412761+09; $array[1]=2004-11-28 19:09:42.898169+09; $array[2]=2004-11-26 17:16:10.531744+09; $array[3]=2004-11-30 20:25:39.622259+09; これをもっとも新しい日付の順序にしたいのですが、 これはやはり、バブルソートなどを作成する必要がでてきますでしょうか???

    • ベストアンサー
    • PHP
  • php多次元配列のソート(usort)について

    http://www.php.net/manual/ja/function.usort.php にusortの例として下記がありますが、それについて質問です。 -------------例文------------- <?php function cmp($a, $b) { return strcmp($a["fruit"], $b["fruit"]); } $fruits[0]["fruit"] = "lemons"; $fruits[1]["fruit"] = "apples"; $fruits[2]["fruit"] = "grapes"; usort($fruits, "cmp"); while (list($key, $value) = each($fruits)) { echo "\$fruits[$key]: " . $value["fruit"] . "\n"; } ?> -------------結果------------- $fruits[0]: apples $fruits[1]: grapes $fruits[2]: lemons 上の例は、usortで$fruitsという配列をソートしています。 そのとき、cmpという関数を条件にしている、というのは分かりますが、 なぜcmpを条件にすることでアルファベットの昇順になるのでしょうか? strcmp($a["fruit"], $b["fruit"]);にたとえばlemonsとかapplesが入って strcmpによって比較がされて、結果として1や-1が返されて その結果、たとえばusort($fruits, "-1")や、usort($fruits, "1") となったとします。それがなぜ結果として昇順になるのでしょうか?

    • ベストアンサー
    • PHP
  • 関数で定義した配列のソート

    お世話になります。 配列のソートは xx = new Array(3, 7, 8, 1); xx.sort(); document.write('xx='+xx+'<br>'); function hikaku(a, b) { return(b - a); } yy = new Array(3, 7, 8, 1); yy.sort(hikaku); document.write('yy='+yy+'<br>'); で、できました。 ここで、 function aitem(name,value,date){ this.name=name; this.value=value; this.date=date; } var goods=new Array( new aitem('b',500,'06/05/01'), new aitem('a',200,'06/07/01'), new aitem('d',800,'06/06/01'), new aitem('c',300,'05/09/01'), ); と、配列goodsを定義します。 そして、例えばvalueで並び替えた配列を取得するなんてことはできないでしょうか。 よろしくお願いします。

  • 多次元配列のソートについて

    始めまして。 多次元配列のソート方法について分からないことがある為教えていただけないでしょうか。 $a[0] = array('2007/3/1','あ100','その他'); $a[1] = array('2007/3/1','あ200','その他'); $a[2] = array('2007/3/2','あ200','その他'); $a[3] = array('2007/3/2','あ300','その他'); $a[4] = array('2007/3/3','あ50','その他'); 上記のような配列があった場合、usort関数でやると、日付かその後ろの数値の値を元にソートできますが、両者の関係を持たせたソートは可能でしょうか。 結果としては $b[0] = "2007/3/3 あ50"; $b[1] = "2007/3/2 あ200"; $b[2] = "2007/3/2 あ300"; $b[3] = "2007/3/1 あ100"; $b[4] = "2007/3/1 あ200"; というようにしたいのです。 よろしくお願いします。

    • ベストアンサー
    • 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
  • 配列のソートと削除

    String型のstrToRemoveで与えられた文字列を配列から探し、あればそれ以降の配列の数字をすべて左にシフトします。 なので配列の大きさは1小さくなります。その結果の配列をreturnで返します。 例) ({"A","B","C","D","B"}, "B")配列1にBがあるのでそれ以降の文字列をすべて左にシフト→ {"A","C","D","B"} ({"A","B","C","D","B"}, "A") 配列0にAがあるのでそれ以降の文字列を左にシフト→ {"B","C","D","B"} プログラムは以下のように組みました。 public class ArrayFun { public String[] oneRemoved(String[] array, String strToRemove) { int count = 0; for (int i = 0; i < array.length; i++) {      if (strToRemove.equals(array[i]) && count == 0) {        for (int j = i; j < array.length - 1; j++) {          array[j] = array[j + 1];        }          count++;      } }      array = new String[array.length - 1];      array[array.length - 1] = null;      return array; } } ちなみにcountは、一度シフトすればもう同じ文字列がそれ以降の配列にあってもシフトはしないので、countでシフトしたかどうかを判断しようと思い付けました。 これでテストメソッドも作るのですが、 import static org.junit.Assert.*; import org.junit.Test; public class ArrayFunTest { @Test public void testoneRemoved() { ArrayFun af = new ArrayFun(); String[] a1 = {"A","B","C","D","B" };//元の配列 String[] a2 = {"A","BB","CCC","DDD","B"};//元の配列 String[] a3 = {"B","C","D","B"};//シフト後の配列 String[] a4 = {"A","BB","CCC","DDD","B"};//シフト後の配列 assertEquals(a3, af.oneRemoved(a1, "A")); assertEquals(a4, af.oneRemoved(a2, "NotHere")); } } 以上のように組むと、assertEqualsの真ん中に黒線が入って自動的に@SuppressWarnings("deprecation")が加えられてしまいます。 実行結果は、({"A","B","C","D","B"}, "A") の例だと、配列0にB が入るはずがnullになっている、とエラーがでます。 どのようにしたら正常に動かせるでしょうか?宜しくお願いします。

    • ベストアンサー
    • Java
  • 連想配列でこういう処理をする関数を探しています

    PHP5.2.4を使用しています。 どういうふうに説明してよいのか分かりませんが、 $arr = array(  'key1' => array('value1'=>1,'value2'=>11),  'key2' => array('value1'=>2,'value2'=>22),  'key3' => array('value1'=>3,'value2'=>33), ); という連想配列を例えばキー'value2'の値だけが欲しく、 $arr = array(  'key1' => 11,  'key2' => 22,  'key3' => 33, ); と、変換したいのですが、そのような関数はあるのでしょうか? またこのような処理をする関数を自作する場合、 どのような関数名が適切でしょうか?(array_○○○)

    • ベストアンサー
    • PHP
  • 連想二次元配列のUNIXTIMEでのソート

    ID(主キー)、unixtime、nameをフィールド名とするとするSQLのデータベースを取得してUNIXTIMEを比較してソートするようなPHPを作りました。   $contents= array(); $temp = mysql_query($query, $link ); while( $contents = mysql_fetch_array($temp, MYSQL_ASSOC)){ } //比較してソート function cmp($a, $b) { print_r($a); if ($a["unixtime"] == $b["unixtime"]) { return 0; } return ((int)$a["unixtime"] < (int)$b["unixtime"]) ? 1 : -1; } usort($contents, "cmp"); しかしこれを実行したところ、 Warning: usort() expects parameter 1 to be array, boolean given in C:\xampp\htdocs\php\outstr.php on line 49 となってしまいます。 usortのエラーのようですが、なぜこうなってしまうのでしょうか。 正常にソートできるような方法を教えてください。

    • ベストアンサー
    • PHP
  • 配列の置き換え

    PHPで教えて欲しいです。 例えば、 $aaa = Array ( [0] => Array ( [id] => 1 [date] => 2009-07-14 [b1] => [b2] => [b3] => [b4] => [b5] => ) [1] => Array ( [id] => 1 [date] => 2009-07-15 [b1] => [b2] => [b3] => [b4] => [b5] => ) と言うような配列があります(実際にはキーは0から13まで固定) そこにもうひとつの配列 $bbb = Array ( [0] => Array ( [id] => 1 [date] => 2009-07-15 [b1] => true [b2] => false [b3] => true [b4] => false [b5] => true ) があります(キーは最大13個ですが、毎回不定数) このような場合で、$aaa配列の[date]と$bbb配列の[date]が同じ物が有った場合、$aaa配列の該当する部分の値を、$bbb配列の値で置き換えたいのですが、どのような方法があるでしょうか? お願いいたします。

    • 締切済み
    • PHP
  • 配列を関数に渡したいのですが…

    次のように配列を関数に渡したいのですが、うまく出来ません。どのようにしたら良いのでしょうか? 渡したい配列の個数は、偶数個ですが、未知の個数です。 $A_LINK = A_LINK("TEST_NAME", "TEST_VAL"); function A_LINK($array) { while (count($array) > 0) { $name = array_shift($array); $value = array_shift($array); $name = urlencode($name); $value = urlencode($value); $msg .= "$name=$value"; } return $msg; }

    • ベストアンサー
    • PHP