mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2025-01-31 09:06:17 +00:00
Merge pull request #4787 from hperrin/master_hash_improvements
Improvements to Hash::expand and Hash::merge. (master)
This commit is contained in:
commit
5582edf6e7
1 changed files with 40 additions and 11 deletions
|
@ -622,6 +622,9 @@ class Hash {
|
|||
*/
|
||||
public static function expand($data, $separator = '.') {
|
||||
$result = array();
|
||||
|
||||
$stack = array();
|
||||
|
||||
foreach ($data as $flat => $value) {
|
||||
$keys = explode($separator, $flat);
|
||||
$keys = array_reverse($keys);
|
||||
|
@ -634,7 +637,24 @@ class Hash {
|
|||
$k => $child
|
||||
);
|
||||
}
|
||||
$result = self::merge($result, $child);
|
||||
|
||||
$stack[] = array($child, &$result);
|
||||
|
||||
while (!empty($stack)) {
|
||||
foreach ($stack as $curKey => &$curMerge) {
|
||||
foreach ($curMerge[0] as $key => &$val) {
|
||||
if (!empty($curMerge[1][$key]) && (array)$curMerge[1][$key] === $curMerge[1][$key] && (array)$val === $val) {
|
||||
$stack[] = array(&$val, &$curMerge[1][$key]);
|
||||
} elseif ((int)$key === $key && isset($curMerge[1][$key])) {
|
||||
$curMerge[1][] = $val;
|
||||
} else {
|
||||
$curMerge[1][$key] = $val;
|
||||
}
|
||||
}
|
||||
unset($stack[$curKey]);
|
||||
}
|
||||
unset($curMerge);
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
@ -654,19 +674,28 @@ class Hash {
|
|||
* @link http://book.cakephp.org/2.0/en/core-utility-libraries/hash.html#Hash::merge
|
||||
*/
|
||||
public static function merge(array $data, $merge) {
|
||||
$args = func_get_args();
|
||||
$return = current($args);
|
||||
$args = array_slice(func_get_args(), 1);
|
||||
$return = $data;
|
||||
|
||||
while (($arg = next($args)) !== false) {
|
||||
foreach ((array)$arg as $key => $val) {
|
||||
if (!empty($return[$key]) && is_array($return[$key]) && is_array($val)) {
|
||||
$return[$key] = self::merge($return[$key], $val);
|
||||
} elseif (is_int($key) && isset($return[$key])) {
|
||||
$return[] = $val;
|
||||
} else {
|
||||
$return[$key] = $val;
|
||||
foreach ($args as &$curArg) {
|
||||
$stack[] = array((array)$curArg, &$return);
|
||||
}
|
||||
unset($curArg);
|
||||
|
||||
while (!empty($stack)) {
|
||||
foreach ($stack as $curKey => &$curMerge) {
|
||||
foreach ($curMerge[0] as $key => &$val) {
|
||||
if (!empty($curMerge[1][$key]) && (array)$curMerge[1][$key] === $curMerge[1][$key] && (array)$val === $val) {
|
||||
$stack[] = array(&$val, &$curMerge[1][$key]);
|
||||
} elseif ((int)$key === $key && isset($curMerge[1][$key])) {
|
||||
$curMerge[1][] = $val;
|
||||
} else {
|
||||
$curMerge[1][$key] = $val;
|
||||
}
|
||||
}
|
||||
unset($stack[$curKey]);
|
||||
}
|
||||
unset($curMerge);
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue