更新。这个版本现在有效 - 如果有人有兴趣:
/**
* returns an array merge from two arrays. Keeps associative keys only. Prefers arrays as values.
* If a key in both arrays has arrays as values the procedure is continued on the next deeper level.
* If a key in both arrays has non-array value then the value from array2 will be used.
*
* @example:
* $array1 = array(1, "a" => array("value"), "b" => array("value", "ba" => 5), "c" => "value", "d" => 5);
* $array2 = array("a" => "value", "b" => array("bb" => 15), "c" => "otherValue");
* $result = array("a" => array("value"), "b" => array("ba" => 5, "bb" => 15), "c" => "otherValue", "d" => 5);
*
* @param array $array1 array to merge
* @param array $array2 array to merge
*
* @return array
*/
public static function arrayMergeDeep($array1, $array2)
{
$return = array();
$keys1 = array_keys($array1);
$keys2 = array_keys($array2);
$allKeys = array_unique(array_merge($keys1, $keys2));
foreach($allKeys as $key) {
if(is_string($key)) {
if(in_array($key, $keys1, true) && !in_array($key, $keys2, true)) {
$return[$key] = $array1[$key];
} elseif(!in_array($key, $keys1, true) && in_array($key, $keys2, true)) {
$return[$key] = $array2[$key];
} elseif(in_array($key, $keys1, true) && in_array($key, $keys2, true)) {
if (is_array($array1[$key]) && !is_array($array2[$key])) {
$return[$key] = $array1[$key];
} elseif (!is_array($array1[$key])) {
$return[$key] = $array2[$key];
} elseif (is_array($array1[$key]) && is_array($array2[$key])) {
$return[$key] = Utils_Array::arrayMergeDeep($array1[$key], $array2[$key]);
} else {
throw new Exception('No way to end up here corectly.');
}
} else {
throw new Exception('No way to end up here corectly.');
}
}
}
return $return;
}
早期的问题是非严格的in_array搜索。现在这很有效。
下面的文字是使上面的文本可以上传。 下面的文字是使上面的thext可上传。 下面的文字是使上面的thext可上传。 下面的文字是使上面的thext可上传。 下面的文字是使上面的thext可上传。 下面的文字是使上面的thext可上传。 下面的文字是使上面的thext可上传。 下面的文字是使上面的thext可上传。 下面的文字是使上面的thext可上传。 下面的文字是使上面的文本上传。
答案 0 :(得分:0)
遇到了问题。它与递归无关。它只是
in_array($key, $keys1)
需要成为
in_array($key, $keys1, true)
等。 “真实”适用于STRICT。否则,匹配字符串键为0索引。