<?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 = [
'Swift_SmtpTransport::class' => [
'__class' => 'Swift_SmtpTransport::class',
'__construct()' => [
'localhost',
],
'setUsername()' => 'user',
'setPassword()' => '',
],
];
$app = [
'Swift_SmtpTransport::class' => [
'__construct()' => [
8888,
true,
],
'setPassword()' => 'mypassword',
],
];
$result = ArrayHelper::merge($package, $app);
var_export($result);
echo "\n\n";
$resultPop = ArrayHelper::mergeReverse($package, $app);
var_export($resultPop);
preferences:
26.33 ms | 406 KiB | 5 Q