2013-12-04 3 views
0

Обновление. эта версия работает сейчас - в случае, если кто-либо заинтересован:undefined index in recursive метод 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; 

} 

Ранняя проблема была нестрогой в поиске по-русски. теперь это работает.

Текст, приведенный ниже, должен сделать его более загружаемым. текст, приведенный ниже, должен сделать текст выше загружаемым. текст, приведенный ниже, должен сделать текст выше загружаемым. текст, приведенный ниже, должен сделать текст выше загружаемым. текст, приведенный ниже, должен сделать текст выше загружаемым. текст, приведенный ниже, должен сделать текст выше загружаемым. текст, приведенный ниже, должен сделать текст выше загружаемым. текст, приведенный ниже, должен сделать текст выше загружаемым. текст, приведенный ниже, должен сделать текст выше загружаемым. текст, приведенный ниже, должен сделать текст выше загружаемым.

+0

Я бы предложил передать вашу выходную переменную по ссылке, поэтому вам не нужно заботиться о том, куда возвращаются ваши прибыли - просто верните истину, пока не остановитесь. http://php.net/manual/en/language.references.pass.php –

+0

Привет, scrowler, можете ли вы помочь мне в том, как вы это сделаете? Я не понимаю, как это должно работать. когда я просто добавляю & $ return в параметрах, ничего не меняется: public static function arrayMergeDeep ($ array1, $ array2, ** & $ return) ** –

ответ

0

возникла проблема. Это не было связано ни с чем, как с рекурсией. Это было просто

in_array($key, $keys1) 

должен стать

in_array($key, $keys1, true) 

и т.д. Если "истина" для СТРОГО. В противном случае есть совпадения со строковыми клавишами с индексом 0.