0

更新。此版本现在可以使用 - 如果有人感兴趣:

/**
 * 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 搜索。现在这有效。

下面的文字是为了使上面的 xt 可上传。下面的文字是为了使上面的 xt 可上传。下面的文字是为了使上面的 xt 可上传。下面的文字是为了使上面的 xt 可上传。下面的文字是为了使上面的 xt 可上传。下面的文字是为了使上面的 xt 可上传。下面的文字是为了使上面的 xt 可上传。下面的文字是为了使上面的 xt 可上传。下面的文字是为了使上面的 xt 可上传。下面的文字是为了使上面的 xt 可上传。

4

1 回答 1

0

有问题。它与递归之类的东西无关。简直是

in_array($key, $keys1)

需要成为

in_array($key, $keys1, true)

等等。其中“true”代表 STRICT。否则,存在与 0 索引的字符串键匹配。

于 2013-12-09T11:57:18.857 回答