3v4l.org

run code in 300+ PHP versions simultaneously
<?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