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 検索でした。これで動作します。

以下のテキストは、上記のテキストをアップロード可能にするためのものです。以下のテキストは、上記のテキストをアップロード可能にするためのものです。以下のテキストは、上記のテキストをアップロード可能にするためのものです。以下のテキストは、上記のテキストをアップロード可能にするためのものです。以下のテキストは、上記のテキストをアップロード可能にするためのものです。以下のテキストは、上記のテキストをアップロード可能にするためのものです。以下のテキストは、上記のテキストをアップロード可能にするためのものです。以下のテキストは、上記のテキストをアップロード可能にするためのものです。以下のテキストは、上記のテキストをアップロード可能にするためのものです。以下のテキストは、上記のテキストをアップロード可能にするためのものです。

4

1 に答える 1

0

問題が発生しました。再帰などとは関係ありませんでした。単純だった

in_array($key, $keys1)

なる必要がある

in_array($key, $keys1, true)

など。「true」はSTRICTの場合です。それ以外の場合は、0 インデックスへの文字列キーとの一致があります。

于 2013-12-09T11:57:18.857 に答える