3v4l.org

run code in 300+ PHP versions simultaneously
<?php interface ModifierInterface { public function apply(array $data, string $key): array; } class ArrayHelper { public static function mergeReverse(...$args): array { return self::applyModifiers(self::performMergeReverse(...$args)); } public static function merge(...$args): array { return self::applyModifiers(self::performMerge(...$args)); } private static function performMergeReverse(...$args): array { $res = array_pop($args) ?: []; while (!empty($args)) { foreach (array_pop($args) as $k => $v) { if (is_int($k)) { if (array_key_exists($k, $res) && $res[$k] !== $v) { $res[] = $v; } else { $res[$k] = $v; } } elseif (is_array($v) && isset($res[$k]) && is_array($res[$k])) { $res[$k] = self::performMergeReverse($v, $res[$k]); } elseif (!isset($res[$k])) { $res[$k] = $v; } } } return $res; } private static function performMerge(...$args): array { $res = array_shift($args) ?: []; while (!empty($args)) { foreach (array_shift($args) as $k => $v) { if (is_int($k)) { if (array_key_exists($k, $res) && $res[$k] !== $v) { $res[] = $v; } else { $res[$k] = $v; } } elseif (is_array($v) && isset($res[$k]) && is_array($res[$k])) { $res[$k] = self::performMerge($res[$k], $v); } else { $res[$k] = $v; } } } return $res; } public static function applyModifiers(array $data): array { $modifiers = []; foreach ($data as $k => $v) { if ($v instanceof ModifierInterface) { $modifiers[$k] = $v; unset($data[$k]); } elseif (is_array($v)) { $data[$k] = self::applyModifiers($v); } } foreach ($modifiers as $key => $modifier) { $data = $modifier->apply($data, $key); } return $data; } } $package = [ 'ApplicationStartup::class' => [ ['WebAppInfoCollector::class', 'collect'], ], 'ApplicationShutdown::class' => [ ['WebAppInfoCollector::class', 'collect'], ], ]; $app = [ 'ApplicationStartup::class' => [ ['AppStartup::class', 'start'], ], 'ApplicationShutdown::class' => [ ['AppShutdown::class', 'shutdown'], ], ]; $result = ArrayHelper::merge($package, $app); var_export($result); echo "\n\n"; $resultPop = ArrayHelper::mergeReverse($package, $app); var_export($resultPop);

preferences:
23.34 ms | 406 KiB | 5 Q