PHP는 다차원 배열 중복 제거
PHPPHP는 다차원 배열 중복 제거
이 질문이 제거가 필요한 복제본인지 확실하지 않지만 다른 곳에서 답을 찾을 수 없으므로 요청할 것입니다.
나는 다음과 같은 2 차원 배열을 가지고있다.
Array
(
[0] => Array
(
[0] => dave
[1] => jones
[2] => c@b.c
)
[1] => Array
(
[0] => john
[1] => jones
[2] => a@b.c
)
[2] => Array
(
[0] => bruce
[1] => finkle
[2] => c@b.c
)
)
중복 된 이메일을 삭제하고 싶습니다. 위의 예에서 [] [0] 또는 [] [2] 중 하나만 제거하고 싶습니다. 나는 이름과 같은 것을 검사하는 것에 대해 걱정할 필요가 없다. 단지 서브 어레이가 단일 값에 기반하여 중복 제거 될 필요가있다.
지금 나는 이런 것을 가지고있다.
if(is_array($array) && count($array)>0){
foreach ($array as $subarray) {
$duplicateEmail[$subarray[2]] = isset($duplicateEmail[$subarray[2]]);
unset($duplicateEmail[$subarray[2]]);
}
}
그러나 그것은 옳지 않습니다. 어떤 도움을 주셔서 감사합니다.
해결법
-
==============================
1.배열 인덱스의 고유성을 사용하는 빠른 솔루션 :
배열 인덱스의 고유성을 사용하는 빠른 솔루션 :
$newArr = array(); foreach ($array as $val) { $newArr[$val[2]] = $val; } $array = array_values($newArr);
알림 1 : 위에서 볼 수 있듯이 전자 메일 주소의 마지막 일치 항목이 첫 번째 항목 대신 사용됩니다. 두 번째 줄을 다음과 같이 바꿀 수 있습니다.
foreach (array_reverse($array) as $val) {
알림 2 : 결과 배열의 인덱스가 다소 섞여 있습니다. 하지만 이건 상관 없어요.
-
==============================
2.훨씬 간단한 솔루션.
훨씬 간단한 솔루션.
$unique = array_map('unserialize', array_unique(array_map('serialize', $array))); echo "<pre>"; print_r($unique);
-
==============================
3.array_unique ()에 대한 사용자 의견에는 이에 대한 몇 가지 해결책이 있습니다. 예를 들어
array_unique ()에 대한 사용자 의견에는 이에 대한 몇 가지 해결책이 있습니다. 예를 들어
http://uk.php.net/manual/en/function.array-unique.php#57202.
-
==============================
4.
$array = array( array('dave','jones','c@b.c'), array('dave','jones','a@c.d'), array('dave','jones','c@b.c'), array('dave','jones','e@v.d'), array('dave','jones','a@c.d') ); $copy = $array; // create copy to delete dups from $usedEmails = array(); // used emails for( $i=0; $i<count($array); $i++ ) { if ( in_array( $array[$i][2], $usedEmails ) ) { unset($copy[$i]); } else { $usedEmails[] = $array[$i][2]; } } print_r($copy);
-
==============================
5.나의 제안 :
나의 제안 :
protected function arrayUnique($array, $preserveKeys = false) { $uniqueArray = array(); $hashes = array(); foreach ($array as $key => $value) { if (true === is_array($value)) { $uniqueArray[$key] = $this->arrayUnique($value, $preserveKeys); } else { $hash = md5($value); if (false === isset($hashes[$hash])) { if ($preserveKeys) { $uniqueArray[$key] = $value; } else { $uniqueArray[] = $value; } $hashes[$hash] = $hash; } } } return $uniqueArray; }
-
==============================
6.사용자 SORT_REGULAR가 두 번째 매개 변수입니다.
사용자 SORT_REGULAR가 두 번째 매개 변수입니다.
$uniqueArray = array_unique($array, SORT_REGULAR);
-
==============================
7.두 번째 매개 변수로 null을 사용하여 array_column ()의 영리한 키 할당 기능을 사용할 수 있습니다. 하위 배열 데이터를 완전히 그대로 유지하면서 각 하위 배열에 새 키를 할당합니다. 이러한 임시 키 (요소 [2] 일명 "전자 메일 값")는 효과적으로 중복 된 전자 메일로 새 하위 배열을 덮어 쓰게됩니다. 중복이 제거되면 array_values ()를 사용하여 (필요한 경우) 배열의 인덱스를 다시 만듭니다.
두 번째 매개 변수로 null을 사용하여 array_column ()의 영리한 키 할당 기능을 사용할 수 있습니다. 하위 배열 데이터를 완전히 그대로 유지하면서 각 하위 배열에 새 키를 할당합니다. 이러한 임시 키 (요소 [2] 일명 "전자 메일 값")는 효과적으로 중복 된 전자 메일로 새 하위 배열을 덮어 쓰게됩니다. 중복이 제거되면 array_values ()를 사용하여 (필요한 경우) 배열의 인덱스를 다시 만듭니다.
이에 : (하지만)
$array = [ ['dave', 'jones', 'c@b.c'], ['john', 'jones', 'a@b.c'], ['bruce', 'finkle', 'c@b.c'] ]; var_export(array_values(array_column($array, null, 2)));
산출:
array ( 0 => array ( 0 => 'bruce', 1 => 'finkle', 2 => 'c@b.c', ), 1 => array ( 0 => 'john', 1 => 'jones', 2 => 'a@b.c', ), )
from https://stackoverflow.com/questions/1861682/php-multi-dimensional-array-remove-duplicate by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
다차원 배열 값에 액세스하기 (0) | 2018.09.20 |
---|---|
pdo - 멤버 함수 호출 prepare () 비 - 객체 [duplicate] (0) | 2018.09.20 |
PHP에서 HTML 전자 메일 보내기 (0) | 2018.09.20 |
html 태그 외부에서 일치하는 PHP 정규식 (0) | 2018.09.19 |
전자 메일 주소 유효성 검사를위한 PHP 라이브러리가 있습니까? [닫은] (0) | 2018.09.19 |