2017-01-27 5 views
1

私はこのような異なるインデックス位置を持つ配列を持っています。並べ替え配列をdatetimeキーで関連付けます

Array 
(
[0] => Array 
    (
     [datetime] => 27/01/2017 12:18 
     [location] => Raunheim (DE) 
     [date] => 27/01/2017 
     [time] => 12:18 
     [status] => Erfolgreich zugestellt. 
     [status_1] => (Retoure an Versender) 
    ) 
[2] => Array 
    (
     [datetime] => 11/01/2017 16:10 
     [location] => Vlotho (DE) 
     [date] => 11/01/2017 
     [time] => 16:10 
     [status] => Ihr Paket konnte nicht wie geplant zugestellt werden und ist wieder im Paketzustellzentrum. 
    ) 
[2] => Array 
    (
     [datetime] => 25/01/2017 11:24 
     [status] => Erfolgreich zugestellt. 
     [status_id] => 
     [date] => 25/01/2017 
     [location] => Altentreptow (DE) 
     [time] => 11:24 
    ) 
) 

datetimeキーを使用してこの配列を並べ替える必要があります。私は解決策を試しました

usort($second_tracking_array, 'date_compare'); 
function date_compare($a, $b) { 

    $date1 = $a['datetime']; 
    $date2 = $b['datetime']; 

    $t1 = strtotime($date1); 
    $t2 = strtotime($date2); 

    echo $t1 . " : " . $t2 . "</br>"; 
    return $t2 - $t1; 
} 

しかし、配列はソートされていません。デバッグでは、関数が動作し、すべてのインデックス位置が正しい場合にのみ配列をソートすることがわかりました。しかし、私の場合、私の配列インデックスの位置のいくつかは異なっています。

+0

あなたはあなたの例では(2倍キー2)のように、同じキー2回を持つことはできません。 '$ array = array_values($ array);' – pixelarbeit

+0

で配列キーを修正できますが、配列の各インデックスに含まれるdatetimeキーは1つだけです。問題は、私はdate_compare関数では、私は頻繁に$ t2を空に直面している。両方の配列が同じ構造化配列を持つ場合にのみ、$ t1と$ t2をタイムスタンプで取得します –

答えて

1

日付文字列を解析する戦略を変更する必要があります。理由は、あなたのdatetime文字列の形式は明らかにの標準適合文字列ではありません。

<?php 

define('CUSTOM_DATE_FORMAT', 'd/m/Y G:i'); 

$second_tracking_array = [ 
    [ 
     'datetime' => '27/01/2017 12:18', 
     'location' => 'Raunheim (DE)', 
     'date' => '27/01/2017', 
     'time' => '12:18', 
     'status' => 'Erfolgreich zugestellt.', 
     'status_1' => '(Retoure an Versender)' 
    ], 
    [ 
     'datetime' => '11/01/2017 16:10', 
     'location' => 'Vlotho (DE)', 
     'date' => '11/01/2017', 
     'time' => '16:10', 
     'status' => 'Ihr Paket konnte nicht wie geplant zugestellt werden und ist wieder im Paketzustellzentrum.' 
    ], 
    [ 
     'datetime' => '25/01/2017 11:24', 
     'status' => 'Erfolgreich zugestellt.', 
     'status_id' => '', 
     'date' => '25/01/2017', 
     'location' => 'Altentreptow (DE)', 
     'time' => '11:24' 
    ] 
]; 

usort(
    $second_tracking_array, 
    function($a, $b) { 
     $date1 = DateTime::createFromFormat(CUSTOM_DATE_FORMAT, $a['datetime']); 
     $date2 = DateTime::createFromFormat(CUSTOM_DATE_FORMAT, $b['datetime']); 
     return $date1 > $date2; 
    } 
); 

print_r($second_tracking_array); 

上記の明白な出力は、次のとおりです。

Array 
(
    [0] => Array 
     (
      [datetime] => 11/01/2017 16:10 
      [location] => Vlotho (DE) 
      [date] => 11/01/2017 
      [time] => 16:10 
      [status] => Ihr Paket konnte nicht wie geplant zugestellt werden und ist wieder im Paketzustellzentrum. 
     ) 

    [1] => Array 
     (
      [datetime] => 25/01/2017 11:24 
      [status] => Erfolgreich zugestellt. 
      [status_id] => 
      [date] => 25/01/2017 
      [location] => Altentreptow (DE) 
      [time] => 11:24 
     ) 

    [2] => Array 
     (
      [datetime] => 27/01/2017 12:18 
      [location] => Raunheim (DE) 
      [date] => 27/01/2017 
      [time] => 12:18 
      [status] => Erfolgreich zugestellt. 
      [status_1] => (Retoure an Versender) 
     ) 

) 
+0

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

+0

@HabibQadoos確かに、あなたは大歓迎です。実際には必要ない 'getTimestamp()'の呼び出しを削除することで、コードをさらに単純化しました。 – arkascha

関連する問題