2017-12-15 17 views
1

私は10/2017から11/2017までの日付の配列を持っています。項目は時間順にリストされています。PHPの日付配列を再構成/再構成するには?

私は、配列やループの構造をインテリジェントに並べ替えるためのPHPソリューションを探していますので、好きなように日付を整理できます。
(旧試み、この例では無視してくださいだけでアップデート下記を参照してくださいすでに提供ソリューションのために、ここでそれを維持。。。)

'1', '1, 10, 2017', '1, 11, 2017' 
'2', '2, 10, 2017', '2, 11, 2017', 
... 
'30', '30, 10, 2017', '30, 11, 2017', 
'31', '31, 10, 2017', '' 
:私はエコーに必要なもの

のようなものです

11月(11)は30日しかないので、31番目のエントリはないことに注意してください。

したがって、配列を繰り返し処理し、同じ開始日のすべての日付をエコーし​​、<br>またはそれに類するものをループする必要があります。それは常にデータがあるかどうか31番目に終わるはずです。


UPDATE:

['1', '1, 10, 2017', '1, 11, 2017'], 
['2', '2, 10, 2017', '2, 11, 2017'], 
... 
['30', '30, 10, 2017', '30, 11, 2017'], 
['31', '31, 10, 2017', '0, 0, 0'] 

主な変更点は次のとおりです:私は私の出力のわずかに異なる表情必要

  • 角括弧は
  • 何も値がない場合(例えば、11月31日は存在しない)、I n以前のように空の文字列ではなく'0, 0, 0'を出力してください。

背景Iは、必ずしも任意の値を必要とする機能を有していて、それは私が異なるもの(FOR-使用/アレイを分離する日、月、年を分割する試み0


であってもよいということですループ/ foreachループを使用して)しかし、何も実際に働いた。私の主な問題は、毎月の日数が違うようです。

これを行うにはアドバイスがありますか?アレイの再構成を試みる方が良いかもしれませんが、それ以外の解決策はありますか?

コードは異なる日付範囲(上記のものだけでなく)で動作するはずです。

これは私の配列である:

Array 
(
    [0] => 1, 10, 2017 
    [1] => 2, 10, 2017 
    [2] => 3, 10, 2017 
    [3] => 4, 10, 2017 
    [4] => 5, 10, 2017 
    [5] => 6, 10, 2017 
    [6] => 7, 10, 2017 
    [7] => 8, 10, 2017 
    [8] => 9, 10, 2017 
    [9] => 10, 10, 2017 
    [10] => 11, 10, 2017 
    [11] => 12, 10, 2017 
    [12] => 13, 10, 2017 
    [13] => 14, 10, 2017 
    [14] => 15, 10, 2017 
    [15] => 16, 10, 2017 
    [16] => 17, 10, 2017 
    [17] => 18, 10, 2017 
    [18] => 19, 10, 2017 
    [19] => 20, 10, 2017 
    [20] => 21, 10, 2017 
    [21] => 22, 10, 2017 
    [22] => 23, 10, 2017 
    [23] => 24, 10, 2017 
    [24] => 25, 10, 2017 
    [25] => 26, 10, 2017 
    [26] => 27, 10, 2017 
    [27] => 28, 10, 2017 
    [28] => 29, 10, 2017 
    [29] => 30, 10, 2017 
    [30] => 31, 10, 2017 
    [31] => 1, 11, 2017 
    [32] => 2, 11, 2017 
    [33] => 3, 11, 2017 
    [34] => 4, 11, 2017 
    [35] => 5, 11, 2017 
    [36] => 6, 11, 2017 
    [37] => 7, 11, 2017 
    [38] => 8, 11, 2017 
    [39] => 9, 11, 2017 
    [40] => 10, 11, 2017 
    [41] => 11, 11, 2017 
    [42] => 12, 11, 2017 
    [43] => 13, 11, 2017 
    [44] => 14, 11, 2017 
    [45] => 15, 11, 2017 
    [46] => 16, 11, 2017 
    [47] => 17, 11, 2017 
    [48] => 18, 11, 2017 
    [49] => 19, 11, 2017 
    [50] => 20, 11, 2017 
    [51] => 21, 11, 2017 
    [52] => 22, 11, 2017 
    [53] => 23, 11, 2017 
    [54] => 24, 11, 2017 
    [55] => 25, 11, 2017 
    [56] => 26, 11, 2017 
    [57] => 27, 11, 2017 
    [58] => 28, 11, 2017 
    [59] => 29, 11, 2017 
    [60] => 30, 11, 2017 
) 

は、任意の助けをありがとう!

+0

なぜあなたの日付は、そのようにフォーマットされていますか? – Kisaragi

+0

私はカスタム関数 'getOrdersByDay($ day_number、$ month_number、$ year_number)'で、日、月、年をパラメータとして使用する必要があるためです。すでにコンマでフォーマットされた配列の日付を持つ方が簡単です。 – Kheber

+0

年を最初に使用して日付を処理します。自分自身をISO8601で考えてみてください。特定の出力フォーマットが必要な場合は、出力を生成するときに書式設定でそれを処理してください。データ構造は出力フォーマットによって管理されるべきではありません。 – ghoti

答えて

0

あなたの望む結果は一種の疑似配列文字列であるようです。これを配列またはjsonとして使用する予定がある場合は、このコードを改良して、最終的な要件に合わせることができます。

3つの異なる出発点を実証コード:(Demo

function buildPseudoArray($month1,$year1){ // default dates in params: $month1=date('m'),$year1=date('Y') causes Fatal error 
    echo "Result for $month1-$year1:\n"; 
    $m1_last=date('t',strtotime("$year1-$month1")); 
    if($month1==12){ 
     $year2=$year1+1; 
     $month2=1; 
    }else{ 
     $year2=$year1; 
     $month2=$month1+1; 
    } 
    $m2_last=date('t',strtotime("$year2-$month2")); 
    $result=''; 
    for($i=1,$stop=31; $i<=$stop; ++$i){ 
     $result.="['$i', "; 
     $result.=$i<=$m1_last ? "'$i, $month1, $year1', " : "'0, 0, 0', "; // conditionally fill missing dates 
     $result.=$i<=$m2_last ? "'$i, $month2, $year2'" : "'0, 0, 0'"; // conditionally fill missing dates 
     $result.=']'.($i<$stop ? ',' : '')."\n"; // conditionally add comma to end of row 
    } 
    return $result; 
} 

echo buildPseudoArray(1,2017); // shows 0, 0, 0 in first column 
echo "\n---------------------\n"; 
echo buildPseudoArray('2',2017); // shows 0, 0, 0 in second column 
echo "\n---------------------\n"; 
echo buildPseudoArray(12,2017); // shows incrementation into next year 

出力:(Demo Link

Result for 1-2017: 
['1', '1, 1, 2017', '1, 2, 2017'], 
['2', '2, 1, 2017', '2, 2, 2017'], 
['3', '3, 1, 2017', '3, 2, 2017'], 
['4', '4, 1, 2017', '4, 2, 2017'], 
['5', '5, 1, 2017', '5, 2, 2017'], 
['6', '6, 1, 2017', '6, 2, 2017'], 
['7', '7, 1, 2017', '7, 2, 2017'], 
['8', '8, 1, 2017', '8, 2, 2017'], 
['9', '9, 1, 2017', '9, 2, 2017'], 
['10', '10, 1, 2017', '10, 2, 2017'], 
['11', '11, 1, 2017', '11, 2, 2017'], 
['12', '12, 1, 2017', '12, 2, 2017'], 
['13', '13, 1, 2017', '13, 2, 2017'], 
['14', '14, 1, 2017', '14, 2, 2017'], 
['15', '15, 1, 2017', '15, 2, 2017'], 
['16', '16, 1, 2017', '16, 2, 2017'], 
['17', '17, 1, 2017', '17, 2, 2017'], 
['18', '18, 1, 2017', '18, 2, 2017'], 
['19', '19, 1, 2017', '19, 2, 2017'], 
['20', '20, 1, 2017', '20, 2, 2017'], 
['21', '21, 1, 2017', '21, 2, 2017'], 
['22', '22, 1, 2017', '22, 2, 2017'], 
['23', '23, 1, 2017', '23, 2, 2017'], 
['24', '24, 1, 2017', '24, 2, 2017'], 
['25', '25, 1, 2017', '25, 2, 2017'], 
['26', '26, 1, 2017', '26, 2, 2017'], 
['27', '27, 1, 2017', '27, 2, 2017'], 
['28', '28, 1, 2017', '28, 2, 2017'], 
['29', '29, 1, 2017', '0, 0, 0'], 
['30', '30, 1, 2017', '0, 0, 0'], 
['31', '31, 1, 2017', '0, 0, 0'] 

--------------------- 
Result for 2-2017: 
['1', '1, 2, 2017', '1, 3, 2017'], 
['2', '2, 2, 2017', '2, 3, 2017'], 
['3', '3, 2, 2017', '3, 3, 2017'], 
['4', '4, 2, 2017', '4, 3, 2017'], 
['5', '5, 2, 2017', '5, 3, 2017'], 
['6', '6, 2, 2017', '6, 3, 2017'], 
['7', '7, 2, 2017', '7, 3, 2017'], 
['8', '8, 2, 2017', '8, 3, 2017'], 
['9', '9, 2, 2017', '9, 3, 2017'], 
['10', '10, 2, 2017', '10, 3, 2017'], 
['11', '11, 2, 2017', '11, 3, 2017'], 
['12', '12, 2, 2017', '12, 3, 2017'], 
['13', '13, 2, 2017', '13, 3, 2017'], 
['14', '14, 2, 2017', '14, 3, 2017'], 
['15', '15, 2, 2017', '15, 3, 2017'], 
['16', '16, 2, 2017', '16, 3, 2017'], 
['17', '17, 2, 2017', '17, 3, 2017'], 
['18', '18, 2, 2017', '18, 3, 2017'], 
['19', '19, 2, 2017', '19, 3, 2017'], 
['20', '20, 2, 2017', '20, 3, 2017'], 
['21', '21, 2, 2017', '21, 3, 2017'], 
['22', '22, 2, 2017', '22, 3, 2017'], 
['23', '23, 2, 2017', '23, 3, 2017'], 
['24', '24, 2, 2017', '24, 3, 2017'], 
['25', '25, 2, 2017', '25, 3, 2017'], 
['26', '26, 2, 2017', '26, 3, 2017'], 
['27', '27, 2, 2017', '27, 3, 2017'], 
['28', '28, 2, 2017', '28, 3, 2017'], 
['29', '0, 0, 0', '29, 3, 2017'], 
['30', '0, 0, 0', '30, 3, 2017'], 
['31', '0, 0, 0', '31, 3, 2017'] 

--------------------- 
Result for 12-2017: 
['1', '1, 12, 2017', '1, 1, 2018'], 
['2', '2, 12, 2017', '2, 1, 2018'], 
['3', '3, 12, 2017', '3, 1, 2018'], 
['4', '4, 12, 2017', '4, 1, 2018'], 
['5', '5, 12, 2017', '5, 1, 2018'], 
['6', '6, 12, 2017', '6, 1, 2018'], 
['7', '7, 12, 2017', '7, 1, 2018'], 
['8', '8, 12, 2017', '8, 1, 2018'], 
['9', '9, 12, 2017', '9, 1, 2018'], 
['10', '10, 12, 2017', '10, 1, 2018'], 
['11', '11, 12, 2017', '11, 1, 2018'], 
['12', '12, 12, 2017', '12, 1, 2018'], 
['13', '13, 12, 2017', '13, 1, 2018'], 
['14', '14, 12, 2017', '14, 1, 2018'], 
['15', '15, 12, 2017', '15, 1, 2018'], 
['16', '16, 12, 2017', '16, 1, 2018'], 
['17', '17, 12, 2017', '17, 1, 2018'], 
['18', '18, 12, 2017', '18, 1, 2018'], 
['19', '19, 12, 2017', '19, 1, 2018'], 
['20', '20, 12, 2017', '20, 1, 2018'], 
['21', '21, 12, 2017', '21, 1, 2018'], 
['22', '22, 12, 2017', '22, 1, 2018'], 
['23', '23, 12, 2017', '23, 1, 2018'], 
['24', '24, 12, 2017', '24, 1, 2018'], 
['25', '25, 12, 2017', '25, 1, 2018'], 
['26', '26, 12, 2017', '26, 1, 2018'], 
['27', '27, 12, 2017', '27, 1, 2018'], 
['28', '28, 12, 2017', '28, 1, 2018'], 
['29', '29, 12, 2017', '29, 1, 2018'], 
['30', '30, 12, 2017', '30, 1, 2018'], 
['31', '31, 12, 2017', '31, 1, 2018'] 

これはあなたのGoogleのチャートタスクの準備をコードであります 回の通話の

出力:

Result for 1-2017: 
[['Day', 'Jan 2017', 'Feb 2017'], 
['01.', '22', '9', ], 
['02.', '30', '24', ], 
['03.', '26', '5', ], 
['04.', '46', '25', ], 
['05.', '7', '24', ], 
['06.', '17', '22', ], 
['07.', '34', '27', ], 
['08.', '0', '26', ], 
['09.', '43', '38', ], 
['10.', '27', '49', ], 
['11.', '7', '22', ], 
['12.', '14', '26', ], 
['13.', '0', '30', ], 
['14.', '45', '43', ], 
['15.', '30', '45', ], 
['16.', '34', '34', ], 
['17.', '19', '30', ], 
['18.', '34', '40', ], 
['19.', '25', '39', ], 
['20.', '1', '1', ], 
['21.', '40', '49', ], 
['22.', '26', '40', ], 
['23.', '37', '44', ], 
['24.', '16', '8', ], 
['25.', '21', '3', ], 
['26.', '47', '35', ], 
['27.', '47', '25', ], 
['28.', '1', '43', ], 
['29.', '7', '30', ], 
['30.', '8', '28', ], 
['31.', '38', '13', ]] 

--------------------- 
Result for 2-2017: 
[['Day', 'Feb 2017', 'Mar 2017'], 
['01.', '5', '48', ], 
['02.', '43', '33', ], 
['03.', '32', '13', ], 
['04.', '30', '23', ], 
['05.', '10', '41', ], 
['06.', '3', '16', ], 
['07.', '46', '23', ], 
['08.', '3', '12', ], 
['09.', '6', '23', ], 
['10.', '48', '29', ], 
['11.', '6', '49', ], 
['12.', '14', '34', ], 
['13.', '44', '2', ], 
['14.', '17', '11', ], 
['15.', '47', '44', ], 
['16.', '35', '9', ], 
['17.', '0', '26', ], 
['18.', '26', '0', ], 
['19.', '7', '5', ], 
['20.', '0', '17', ], 
['21.', '4', '9', ], 
['22.', '43', '37', ], 
['23.', '21', '28', ], 
['24.', '22', '12', ], 
['25.', '15', '50', ], 
['26.', '16', '34', ], 
['27.', '33', '21', ], 
['28.', '2', '37', ], 
['29.', '31', '41', ], 
['30.', '50', '28', ], 
['31.', '3', '34', ]] 

--------------------- 
Result for 12-2017: 
[['Day', 'Dec 2017', 'Jan 2018'], 
['01.', '42', '48', ], 
['02.', '17', '44', ], 
['03.', '11', '26', ], 
['04.', '5', '11', ], 
['05.', '44', '1', ], 
['06.', '37', '33', ], 
['07.', '33', '32', ], 
['08.', '43', '35', ], 
['09.', '5', '35', ], 
['10.', '27', '6', ], 
['11.', '24', '0', ], 
['12.', '35', '33', ], 
['13.', '38', '4', ], 
['14.', '11', '35', ], 
['15.', '0', '18', ], 
['16.', '3', '43', ], 
['17.', '31', '20', ], 
['18.', '12', '19', ], 
['19.', '38', '34', ], 
['20.', '38', '45', ], 
['21.', '11', '32', ], 
['22.', '12', '13', ], 
['23.', '47', '38', ], 
['24.', '37', '17', ], 
['25.', '36', '44', ], 
['26.', '47', '4', ], 
['27.', '40', '48', ], 
['28.', '5', '20', ], 
['29.', '18', '4', ], 
['30.', '15', '48', ], 
['31.', '38', '19', ]] 
+0

あなたのソリューションをありがとう、それはトリックを行います。 @tbednerからのアプローチは、1つのものの代わりに柔軟な年を使うことができるので、もう少し多くなります。あなたのソリューションを修正することも私にとってはうまくいくでしょう! – Kheber

+0

連絡先に連絡し、ソリューションの品質についてさらに説明してくれてありがとう。私はそれが他の答えよりも優れている理由を知っていますが、私は何年かチェックする可能性がありません。私は指定された日付だけでなく、スケーラブルなものが必要です(2015年から2016年の配列に日付を入れることを意味し、2017年だけでなく)。 さらに、出発点の2つの調整を出力に更新しました。たぶん、あなたのコードを助けたり調整したりすることができます。あなたの解決策をチェックして、受け入れられた答えとしてマークしてください! :) – Kheber

+0

異なる日付の注文金額を説明するためにGoogle Chartsに必要です。これは現在、https://jsfiddle.net/96kktoj2/1/(JSセクションの2つの 'var data'配列を参照)のようになります。私は特定の(注文)量であるデータベース結果を受け取るPHP関数 'getOrdersByDay($ day_number、$ month_number、$ year_number)'を持っています。私は私のJSコード(私は知っている最良の方法ではない)でこのPHP関数を使用しています、今私は2つの日付の間のすべての日付のこの機能を実行しようとしています。このフィドルでは、PHP関数と実際のデータでどのように見えるかの2つの例を示しています。 – Kheber

0

私はそう遠く離れていても何もしないことをお勧めします。日付と時刻は、見た目よりはるかに複雑であるため、手動で処理したいものではありません。

<?php 
$period = new DatePeriod(
    new DateTime('2017-01-01'), // start 
    new DateInterval('P1M'), // interval of 1 month 
    new DateTime('2018-01-01') // end 
); 

foreach($period as $date) { 
    printf("%s\n", $date->format('Y-m-d')); 
} 

出力:

2017-01-01 
2017-02-01 
2017-03-01 
2017-04-01 
2017-05-01 
2017-06-01 
2017-07-01 
2017-08-01 
2017-09-01 
2017-10-01 
2017-11-01 
2017-12-01 

http://php.net/manual/en/class.datetime.php
http://php.net/manual/en/class.dateperiod.php
http://php.net/manual/en/class.dateinterval.php
http://php.net/manual/en/book.datetime.php

そして、ちょうど親指のルールとして:あなたは今まで自分が手動のような巨大な、反復配列を定義見つけた場合おそらく一歩後退してあなたのアプローチを再検討してください。

+0

あなたの答えをありがとう。私は配列を作成するのに似たようなアプローチを使いましたが、必要に応じてアイテムを整理/ループするのに苦労しました。 '1、10、2017'、 '1、11、2017' '2、10、2017' '2,11,2017' であり、 '1,0,201'、 '2,10,2017' などである。 – Kheber

0

私はこれに@Sammitchと全面的に同意します。あなたは、配列をこの配列、することができますループを使用してのようなUnixの時間のエントリをキャストするのstrtotimeを使用する必要がある場合:

foreach($date_array as $key => $value) { 
    $value = explode(",",$value); 
    $value = trim($value[2])."-".trim($value[1])."-".trim($value[0]); 
    $value = strtotime($value); 
    $date_array[$key] = $value; 
} 

そのまま使用すると、配列に対処したい場合は、ここでその意志何かがありますあなたが探しているものに近づく:

<?php 
$date_array = array(
    0 => "1, 10, 2017", 
    1 => "2, 10, 2017", 
    2 => "3, 10, 2017", 
    3 => "4, 10, 2017", 
    4 => "5, 10, 2017", 
    5 => "6, 10, 2017", 
    6 => "7, 10, 2017", 
    7 => "8, 10, 2017", 
    8 => "9, 10, 2017", 
    9 => "10, 10, 2017", 
    10 => "11, 10, 2017", 
    11 => "12, 10, 2017", 
    12 => "13, 10, 2017", 
    13 => "14, 10, 2017", 
    14 => "15, 10, 2017", 
    15 => "16, 10, 2017", 
    16 => "17, 10, 2017", 
    17 => "18, 10, 2017", 
    18 => "19, 10, 2017", 
    19 => "20, 10, 2017", 
    20 => "21, 10, 2017", 
    21 => "22, 10, 2017", 
    22 => "23, 10, 2017", 
    23 => "24, 10, 2017", 
    24 => "25, 10, 2017", 
    25 => "26, 10, 2017", 
    26 => "27, 10, 2017", 
    27 => "28, 10, 2017", 
    28 => "29, 10, 2017", 
    29 => "30, 10, 2017", 
    30 => "31, 10, 2017", 
    31 => "1, 11, 2017", 
    32 => "2, 11, 2017", 
    33 => "3, 11, 2017", 
    34 => "4, 11, 2017", 
    35 => "5, 11, 2017", 
    36 => "6, 11, 2017", 
    37 => "7, 11, 2017", 
    38 => "8, 11, 2017", 
    39 => "9, 11, 2017", 
    40 => "10, 11, 2017", 
    41 => "11, 11, 2017", 
    42 => "12, 11, 2017", 
    43 => "13, 11, 2017", 
    44 => "14, 11, 2017", 
    45 => "15, 11, 2017", 
    46 => "16, 11, 2017", 
    47 => "17, 11, 2017", 
    48 => "18, 11, 2017", 
    49 => "19, 11, 2017", 
    50 => "20, 11, 2017", 
    51 => "21, 11, 2017", 
    52 => "22, 11, 2017", 
    53 => "23, 11, 2017", 
    54 => "24, 11, 2017", 
    55 => "25, 11, 2017", 
    56 => "26, 11, 2017", 
    57 => "27, 11, 2017", 
    58 => "28, 11, 2017", 
    59 => "29, 11, 2017", 
    60 => "30, 11, 2017" 
); 
for($i=1;$i<=31;$i++) { 
    $line = "'".$i."', "; 
    foreach($date_array as $key => $value) { 
    $exp = explode(",",$value); 
    if($exp[0] == $i) { 
     $line .= "'".$value."', "; 
    } 
    } 
    echo $line."<br />"; 
} 

?> 

出力:

'1'、 '1、10、2017'、 '1、11、2017'、

'2' 、 '2,10,2017'、 '2,11,2207'、

...

'30'、'30、10、2017' 、'30、11、2017' 、

'31'、'31、10、2017' 、