递归方法调用中的未定义索引


undefined index in recursive method call

更新。这个版本现在可以使用了——如果有人感兴趣的话:

/**
 * 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;
}

早期的问题是不严格的inarray搜索。现在这就行了。

下面的文本是为了使上面的文本可以上传。下面的文本是为了使上面的文本可以上传。下面的文本是为了使上面的文本可以上传。下面的文本是为了使上面的文本可以上传。下面的文本是为了使上面的文本可以上传。下面的文本是为了使上面的文本可以上传。下面的文本是为了使上面的文本可以上传。下面的文本是为了使上面的文本可以上传。下面的文本是为了使上面的文本可以上传。下面的文本是为了使上面的文本可以上传。

遇到问题。它与递归无关。这只是

in_array($key, $keys1)

需要成为

in_array($key, $keys1, true)

等等。其中"true"表示STRICT。否则,存在与0索引的字符串键匹配的项。