2017-03-29 11 views
0

現在、次のjsonデータを使用しています。私は、PHP配列へデータを移動してい現在の時間に基づいてPHP配列をソート

"chart": { 
    "23:20": 11, 
    "23:30": 11, 
    "23:40": 11, 
    "23:50": 16, 
    "00:00": 16, 
    "00:10": 14, 
    "00:20": 11, 
    "00:30": 12, 
    "00:40": 14, 
    "00:50": 10, 
    "01:00": 8, 
    "01:10": 12, 
    "01:20": 15, 
    "01:30": 13, 
    "01:40": 11, 
    "01:50": 8, 
    "02:00": 8 
} 

https://pastebin.com/cp16Rr9w

:(MM鍵は、時間HHです)。私は配列をソートしたいので、現在のサーバ時間から開始し、そこから進んでいきます。

現時点では私は

<?php 
    foreach ($data['chart'] as $key => $value){ 
     echo 'Time: '.$key.'Data: '.$value; 
    } 
    ?> 
+0

配列をソートについてのSOの答えのトンが今そこにある、あなたの試みと問題がある場合は、あなたがしようとしたとしているものを私たちに教えてください。 – hassan

+0

私はuksortを探していますが、私はそれを理解していないので試したことはありません – Mattigins

+0

あなたが持っていたい出力の例を追加できますか? – radicarl

答えて

0

が最も簡単な方法は、おそらくarray_filter()で最初にすべての「古すぎる」エントリをフィルタリングして、ksort()を使用して、得られた配列をソートすることです(ソートされていない)、以下のPHPを使用しています:

<?php 

function getFilter($server_time) { 
    return function($item) use($server_time) { 
     return (strtotime($item) >= $server_time); 
    }; 
} 

$data = '{"chart": { 
      "23:20": 11,"23:30": 11,"23:40": 11,"23:50": 16,"00:00": 16, 
      "00:10": 14,"00:20": 11,"00:30": 12,"00:40": 14,"00:50": 10, 
      "01:00": 8,"01:10": 12,"01:20": 15,"01:30": 13,"01:40": 11, 
      "01:50": 8,"02:00": 8 
}}'; 

$json = json_decode($data, true); 
$src = $json['chart']; 

$server_time = strtotime("now"); 

$filtered = array_filter($src, getFilter($server_time), ARRAY_FILTER_USE_KEY); 
ksort($filtered); 

print_r($filtered); 

ライブテスト・ケース:

+0

私はuksort()を理解できません。だから、この '$ time = date(" H:i "); \t \t関数timeSort($ a、$ b){ \t \t if($ a == $ b)は0を返します。 \t \t return($ a <$ b)? - 1:1; \t \t} \t \t \t \t uksort($データ[ 'チャート']、 "timeSort"); ';'私は変数 – Mattigins

+1

'$ time'を使用する方法を理解していません($ a)は'のvar_dumpを入れてあなたの 'timeSort()'メソッド本体で、あなたは...試行錯誤します! –

+0

@MarcinOrlowski私はそれはソートだけではないと思うので、 "それは現在のサーバ時間から始まり、そこから始まります。" – hassan

-1
function hsort($a, $b) // callback function for uksort function 
{ 
    return (floatval(str_replace(":", ".", $a)) - floatval(str_replace(":", ".", $b))) // convert each time to float value, like '01:56'-> "01.56", then compare values as float 
} 

$chart = array_flip($chart); // flip indexes with values to get ability to operate with indexes as array values (which are time in your array) 
uksort($chart, "hsort"); // sort time values 
$chart = array_flip($chart); // flip again to make time values as index again 
+0

これは何も説明しません。私は説明がありますか? – Mattigins

+0

コメントが追加されました。 – diavolic

+0

私が見る限り、これは時間を最低から最高まで並べ替えていますか? – Mattigins

0

それを試してみてください。

$data = json_decode('{"chart": { 
    "23:20": 11, 
    "23:30": 11, 
    "23:40": 11, 
    "23:50": 16, 
    "00:00": 16, 
    "00:10": 14, 
    "00:20": 11, 
    "00:30": 12, 
    "00:40": 14, 
    "00:50": 10, 
    "01:00": 8, 
    "01:10": 12, 
    "01:20": 15, 
    "01:30": 13, 
    "01:40": 11, 
    "01:50": 8, 
    "02:00": 8 
}}'); 

$data = (array) $data->chart; 

function sort_time($a, $b) { return strtotime($a) > strtotime($b); } 

uksort($data, 'sort_time'); 

foreach ($data as $key => $value) { 
    echo "$key: $value\n"; 
} 
関連する問題