i have following array data
0 =>
id => 1
id_requestor => 1
jam_input => 2015-07-04 08:00:00
jam_pakai => 2015-07-04 08:30:00
total_poin => 10
1 =>
id => 2
id_requestor => 2
jam_input => 2015-07-04 06:23:00
jam_pakai => 2015-07-04 08:30:00
total_poin => 15
2 =>
id => 3
id_requestor => 3
jam_input => 2015-07-04 07:24:00
jam_pakai => 2015-07-04 08:30:00
total_poin => 15
3 =>
id => 4
id_requestor => 4
jam_input => 2015-07-04 05:09:00
jam_pakai => 2015-07-04 08:30:00
total_poin => 10
In above array, there are some total_poin
data that have same value, but different jam_input
value.
I want to sort array data in descending order. And i already sort it by desc. But i want to add jam_input
value checking if found same value in total_poin
. And then, if found jam_input[i]
< jam_input[i+1]
add data in i
in front of i+1
.
Here is my sorting code :
function LJFAlgorithm($arrayParam) {
// Ambil Data array dari database sesuai dengan waktu sekarang
$batchData = getBatch($arrayParam);
// Flag untuk penanda apakah array sudah tersortir
$sorted = false;
// Jika belum tersortir maka
while (false === $sorted) {
$sorted = true;
// Looping batchData - 1
for ($i = 0; $i < count($batchData)-1; ++$i) {
// Data Awal
$current = $batchData[$i]['total_poin'];
// Data Indeks selanjutnya
$next = $batchData[$i+1]['total_poin'];
// Jika poin awal data > dari poin selanjutnya maka,
if ($next > $current) {
// Ganti nilai data awal dengan data selanjutnya
$batchData[$i]['total_poin'] = $next;
// Ganti data selanjutnya dengan data awal
$batchData[$i+1]['total_poin'] = $current;
// Ganti status berurutan ke false 'reset ulang'
$sorted = false;
} else if ($next == $current) {
// If found same total_poin
if (strtotime($batchData[$i]['jam_input']) > strtotime($batchData[$i + 1]['jam_input'])) {
// Ganti nilai data awal dengan data selanjutnya
$batchData[$i]['total_poin'] = $next;
// Ganti data selanjutnya dengan data awal
$batchData[$i+1]['total_poin'] = $current;
}
}
}
}
// Kembalikan array yang sudah terurut
return $batchData;
}
My current result is like this.
0 =>
id => 1
id_requestor => 1
jam_input => 2015-07-04 08:00:00
jam_pakai => 2015-07-04 08:30:00
total_poin => 10
1 =>
id => 2
id_requestor => 2
jam_input => 2015-07-04 06:23:00
jam_pakai => 2015-07-04 08:30:00
total_poin => 15
2 =>
id => 3
id_requestor => 3
jam_input => 2015-07-04 07:24:00
jam_pakai => 2015-07-04 08:30:00
total_poin => 15
3 =>
id => 4
id_requestor => 4
jam_input => 2015-07-04 05:09:00
jam_pakai => 2015-07-04 08:30:00
total_poin => 10
My expected result is :
0 =>
id => 2
id_requestor => 2
jam_input => 2015-07-04 06:23:00
jam_pakai => 2015-07-04 08:30:00
total_poin => 15
1 =>
id => 3
id_requestor => 3
jam_input => 2015-07-04 07:24:00
jam_pakai => 2015-07-04 08:30:00
total_poin => 15
2 =>
id => 4
id_requestor => 4
jam_input => 2015-07-04 05:09:00
jam_pakai => 2015-07-04 08:30:00
total_poin => 10
3 =>
id => 1
id_requestor => 1
jam_input => 2015-07-04 08:00:00
jam_pakai => 2015-07-04 08:30:00
total_poin => 10
Please help ^^ Thank you very much.
sort by usort. If total_poins are equal compare times using strtotime
usort($arrayParam, function($a, $b) {
return ($ret = $b['total_poin'] - $a['total_poin'] ) ?
$ret :
strtotime($a['jam_input']) - strtotime($b['jam_input']); } );
print_r($arrayParam);