Rekursywne łączenie tablic bez powtórzeń

Coś, co moim zdaniem obok array_merge i array_merge_recursive obowiązkowo powinno być dołączone do PHP a nie jest…

Pobrane z php.net z forum:

/**
 * Merges any number of arrays / parameters recursively, replacing 
 * entries with string keys with values from latter arrays. 
 * If the entry or the next value to be assigned is an array, then it 
 * automagically treats both arguments as an array.
 * Numeric entries are appended, not replaced, but only if they are 
 * unique
 *
 * calling: result = array_merge_recursive_distinct(a1, a2, ... aN)
**/

function array_merge_recursive_distinct () {
  $arrays = func_get_args();
  $base = array_shift($arrays);
  if(!is_array($base)) $base = empty($base) ? array() : array($base);
  foreach($arrays as $append) {
    if(!is_array($append)) $append = array($append);
    foreach($append as $key => $value) {
      if(!array_key_exists($key, $base) and !is_numeric($key)) {
        $base[$key] = $append[$key];
        continue;
      }
      if(is_array($value) or is_array($base[$key])) {
        $base[$key] = array_merge_recursive_distinct($base[$key], $append[$key]);
      } else if(is_numeric($key)) {
        if(!in_array($value, $base)) $base[] = $value;
      } else {
        $base[$key] = $value;
      }
    }
  }
  return $base;
}

W środku funkcji jest miejsce gdzie sama siebie wywołuje. Oczywiście jeśli funkcja jest metodą wewnątrz klasy to zależnie od tego czy jest statyczna czy nie należy zamiast array_merge_recursive_distinct podać self::array_merge_recursive_distinct lub $this->array_merge_recursive_distinct

1 thought on “Rekursywne łączenie tablic bez powtórzeń

Comments are closed.