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

时间:2013-12-04 18:11:58

标签: php recursion undefined-index

更新。这个版本现在有效 - 如果有人有兴趣:

/**
 * 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可上传。 下面的文字是使上面的文本上传。

1 个答案:

答案 0 :(得分:0)

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

in_array($key, $keys1)

需要成为

in_array($key, $keys1, true)

等。 “真实”适用于STRICT。否则,匹配字符串键为0索引。