<?php
$data = array(
array(
'id' => 1,
'timestamp' => 1503050400,
'name' => 'Event A',
'value' => null,
),
array(
'id' => 2,
'timestamp' => 1503446400,
'name' => 'Event B',
'value' => null,
),
array(
'id' => 2,
'timestamp' => 1503446400,
'name' => 'Event B',
'value' => 71,
),
array(
'id' => 3,
'timestamp' => 1503720000,
'name' => 'Event C',
'value' => 12,
),
array(
'id' => 3,
'timestamp' => 1503720000,
'name' => 'Event C',
'value' => null,
),
);
$buckets = array();
foreach ($data as $item) {
$bucketName = serialize(array(
'id' => $item['id'],
'timestamp' => $item['timestamp'],
'name' => $item['name'],
));
if (!array_key_exists($bucketName, $buckets)) {
$buckets[$bucketName] = array();
}
$buckets[$bucketName][] = $item;
}
$filtered = array_reduce(
$buckets,
function (array $carry, array $items) {
if (1 === count($items)) {
$carry[] = array_shift($items);
return $carry;
}
$withoutNullValue = array_filter($items, function (array $item) {
return array_key_exists('value', $item) && null !== $item['value'];
});
if (0 < count($withoutNullValue)) {
$carry = array_merge(
$carry,
$withoutNullValue
);
return $carry;
}
$carry[] = array_shift($items);
return $carry;
},
array()
);
var_dump($filtered);
preferences:
25.65 ms | 409 KiB | 5 Q