2014-02-13 4 views
1

다중 값 배열에서 중복 값을 제거하려면 이미 설명 된 가능한 모든 솔루션을 시도했지만 작동하지 않는 경우 누구든지 수정할 수 있습니까? 여기 내 배열입니다 : 키 인덱스 이후다차원 배열에서 중복 값을 없애는 방법

Array ( 
    [0] => Array ( 
     [0] => element_10 
     [1] => block_1 
     [2] => element_4 
     [3] => element_1 
     [4] => element_3 
       ) 
[1] => Array ( 
     [1] => block_2 
     [2] => element_8 
     [4] => element_12 
     [5] => element_14 
     [7] => element_2 
     [9] => element_9 
     [10] => element_13 
     [11] => element_7 
     ) 
) 

ICAN 설정 :이 형식의 배열을 원하는

Array ( 
    [0] => Array ( 
     [0] => element_10 
     [1] => block_1 
     [2] => element_4 
     [3] => element_1 
     [4] => element_3 
       ) 
[1] => Array ( 
     [0] => block_1 
     [1] => block_2 
     [2] => element_8 
     [3] => element_10 
     [4] => element_12 
     [5] => element_14 
     [6] => element_4 
     [7] => element_2 
     [8] => element_3 
     [9] => element_9 
     [10] => element_13 
     [11] => element_7 
     ) 
) 

.

나는 시도하지 :

function multi_unique($array) { 
    foreach ($array as $k=>$na) 
     $new[$k] = serialize($na); 
    $uniq = array_unique($new); 
    foreach($uniq as $k=>$ser) 
     $new1[$k] = unserialize($ser); 
    return ($new1); 
} 

운, 나는 시도 :

function array_unique_multidimensional($input) 
{ 
    $serialized = array_map('serialize', $input); 
    $unique = array_unique($serialized); 
    return array_intersect_key($input, $unique); 
} 

여전히 같은 배열을 반환.

은 나도이 방법을 시도 :

function super_unique($array) 
{ 
    $result = array_map("unserialize", array_unique(array_map("serialize", $array))); 

    foreach ($result as $key => $value) 
    { 
    if (is_array($value)) 
    { 
     $result[$key] = self::super_unique($value); 
    } 
    } 
    return $result; 
} 

제발 도와주세요, 나는 내가 잃고 어디 모르는 아주 간단 알아?

감사합니다.

답변

2

입력 배열 목록을 반복해야합니다. 해당 배열의 각 값에 대해 이전에 발생했는지 확인해야하므로 점차적으로 추가하는 모든 배열에서 모든 값의 수퍼 집합을 유지해야합니다. 값이 이미 수퍼 세트에 존재하면 제거 할 수 있습니다. 그렇지 않으면 추가 할 수 있습니다.

function multi_unique($arrays) { 
    $all_values = array(); 

    foreach ($arrays as &$array) { 
    foreach ($array as $index => $value) { 
     if (in_array($value, $all_values)) { 
     // We've seen this value previously 
     unset($array[$index]); 
     } else { 
     // First time we've seen this value, let it pass but record it 
     $all_values[] = $value; 
     } 
    } 
    } 
    return $arrays; 
} 


$values = array (
    array ('element_10', 'block_1', 'element_4', 'element_1', 'element_3',) , 
    array ('block_1', 'block_2', 'element_8', 'element_10', 'element_12', 'element_14', 'element_4', 'element_2', 'element_3', 'element_9', 'element_13', 'element_7',) 
); 

var_dump(multi_unique($values)); 

출력 : 당신이 당신 배열의 두 번째 항목에서 중복을 제거하려면

array(2) { 
    [0]=> 
    array(5) { 
    [0]=> 
    string(10) "element_10" 
    [1]=> 
    string(7) "block_1" 
    [2]=> 
    string(9) "element_4" 
    [3]=> 
    string(9) "element_1" 
    [4]=> 
    string(9) "element_3" 
    } 
    [1]=> 
    array(8) { 
    [1]=> 
    string(7) "block_2" 
    [2]=> 
    string(9) "element_8" 
    [4]=> 
    string(10) "element_12" 
    [5]=> 
    string(10) "element_14" 
    [7]=> 
    string(9) "element_2" 
    [9]=> 
    string(9) "element_9" 
    [10]=> 
    string(10) "element_13" 
    [11]=> 
    string(9) "element_7" 
    } 
} 
+0

은 $ 지수, $ 지수 => $ 값 $ 값에 대한 오타있다 하지만 난 유지하려는 배열을 병합하지 않을 수있는 것은 '[0] = [0] => element_10 [1] => block_1 [2] => element_8 ....' '[1] = [0] => element_1 [1] => block_2 [2] => element_10 ....' – Nadeem

+0

완벽한 당신 ' 다시 생명 구세주 @ 마가 : – Nadeem

+0

perform performace! 아래 @ moonwave99 대답을보십시오. –

1

, array_diff() 사용

$array[1] = array_diff($array[1], $array[0]); 

으로 반복을 당신이에 적용하려는 경우 임의의 길이.

+0

고마워요, 오늘, 뭔가 배웠습니다 – Nadeem

+0

최고의 솔루션 !! 배열에 너무 많은 중첩 루프를 반복하는 것이 좋습니다. 그러나 2 개 이상의 요소 배열에만 적용 할 수 있습니다. +1 함 –

0

serialize 기능을 사용하고 있습니까?

대신 array_diff를 사용하십시오.

간단합니다.

$orginal = array(array(values), array(values), ...); 

$copy = $original; 

foreach($original as $k => $subArray) { 
    $tmpCopy = $copy; 
    unset($tmpCopy[$k]); 
    unshift($tmpCopy, $subArray); 
    $tmpCopy = array_values($tmpCopy); 
    $original[$k] = call_user_func_array('array_diff', $tmpCopy); 
} 

이것은 이차원 배열 작동.

희망이 있습니다.

관련 문제