fork download
  1. <?php
  2.  
  3. // このサイトはPHP 5.2.11なので匿名関数使えません
  4.  
  5. function countcmp($a,$b){
  6. return -($a["count"] - $b["count"]);
  7. }
  8.  
  9. function getPath($uristring){
  10. // 俺の好み上、文法で分割するparse_urlを選んだが、人によっては文字列操作するだけにとどめるかも。
  11. // parse_url関数はマニュアルにあるとおりURIとして文法が正しいかどうかのチェックをしない。残念ながら。
  12.  
  13. // 別に第二引数をparse_urlに与えてもいいんだが、
  14. // もともと俺がC#ユーザーのせいか、関数名が同じで戻り値の型が異なるって落ち着かないので。
  15.  
  16. $parsed = parse_url($uristring);
  17. return $parsed["path"];
  18. }
  19.  
  20. function process($item,$key,$data){
  21. $path = getPath($item["url"]);
  22. if(!array_key_exists($path ,$data)){
  23. // あえて$dataは連想配列に。
  24. // 足し算のときに一々該当するものを配列から探したくないんで。
  25. // 配列がほしい様だからそれはこのコールバックじゃなくて外でやる
  26. $data[$path] = array( "url" => $path , "date"=>$item["date"] , "count"=> 0 );
  27. }
  28. $data[$path]["count"] = $data[$path]["count"] + $item["count"];
  29.  
  30. }
  31.  
  32. // 主観では、dateをそれぞれの配列が持たない形にしたほうがいいと思う
  33. // もし、urlが一緒で異なるdateになっているものがあったとき対処に悩むから。
  34. // リレーショナルデータベースの「正規化」ってのを学ぶといい。
  35.  
  36. $x = array(
  37. "url" => "/hoge/piyo.html",
  38. "date" => 20110105,
  39. "count" => 4
  40. ),
  41. "url" => "/hoge/",
  42. "date" => 20110105,
  43. "count" => 1
  44. ),
  45. "url" => "/kiyo.html?post_id=158",
  46. "date" => 20110105,
  47. "count" => 2
  48. ),
  49. "url" => "/blog/",
  50. "date" => 20110105,
  51. "count" => 3
  52. ),
  53. "url" => "/kiyo.html",
  54. "date" => 20110105,
  55. "count" => 1
  56. ),
  57. "url" => "/kiyo.html",
  58. "date" => 20110105,
  59. "count" => 2
  60. )
  61. );
  62. $temp = array();
  63.  
  64. // 三つ目の引数参照渡しにしないと異なるインスタンスとして処理される模様
  65. array_walk($x,"process",&$temp);
  66. // 配列でよこせ、って言っているので。
  67. $result = array_values ( $temp );
  68.  
  69. //2012-01-06T15:08+09:00
  70. //キーを保存してはいけなかったのでuasortからusortに訂正。
  71.  
  72. usort ( $result , "countcmp" );
  73.  
  74. // 2012-01-06T15:11+09:00
  75. // C#では関数への参照をメソッド名で指定するんで、メソッドを渡す方法がPHPでも使える…とか考えながら
  76. // http://i...content-available-to-author-only...e.com/k1Xuv
  77. // のコードを書いていました。が、それ誤りですね。
  78. // PHPでは、ダブルクオートでくくられてないASCII文字の塊は文字列とみなされることがあるんでした。
  79. // 渡っているのは文字列です。ということで、それを明示する意味もこめて今回はダブルクオートで関数名をくくっています
  80. // どうもC#の癖から文字列をシングルクオート(利点:変数展開をしない)でくくる様にならない。いつもダブルクオートにしてしまう。まぁいいや。
  81. print_r($result);
  82.  
  83. //2012-01-09T21:47+09:00
  84. // このサイトの都合で、修正履歴をコメントに書いている。読む人に向けたコメントはある程度必要であるが、
  85. // こういう修正履歴ばかりが多く連なりすぎると却ってコードが読みづらくなる。取り消し線だらけの書類は読みづらいでしょ?
  86. // コメントはわかりやすい参考書とかを明示したり、コードを後の人に読みやすくするためのものなのに本末転倒にしてはならない。
  87. // そういう修正履歴は読みづらくなる前にソフトに管理してもらうことも検討してみよう。Gitとか。もう知っているかもしれないが。
  88.  
  89.  
  90. ?>
Success #stdin #stdout 0.02s 13112KB
stdin
Standard input is empty
stdout
Array
(
    [0] => Array
        (
            [url] => /kiyo.html
            [date] => 20110105
            [count] => 5
        )

    [1] => Array
        (
            [url] => /hoge/piyo.html
            [date] => 20110105
            [count] => 4
        )

    [2] => Array
        (
            [url] => /blog/
            [date] => 20110105
            [count] => 3
        )

    [3] => Array
        (
            [url] => /hoge/
            [date] => 20110105
            [count] => 1
        )

)