PHP에서 다차원 배열에서 중복 값을 제거하는 방법
PHPPHP에서 다차원 배열에서 중복 값을 제거하는 방법
PHP의 다차원 배열에서 중복 값을 제거하려면 어떻게해야합니까?
예제 배열 :
Array
(
[0] => Array
(
[0] => abc
[1] => def
)
[1] => Array
(
[0] => ghi
[1] => jkl
)
[2] => Array
(
[0] => mno
[1] => pql
)
[3] => Array
(
[0] => abc
[1] => def
)
[4] => Array
(
[0] => ghi
[1] => jkl
)
[5] => Array
(
[0] => mno
[1] => pql
)
)
해결법
-
==============================
1.
다른 방법이 있습니다. 중간 변수는 저장되지 않습니다.
우리는 이것을 사용하여 다양한 중첩 쿼리의 결과를 중복 제거했습니다.
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
-
==============================
2.
5.2.9부터 SORT_REGULAR 플래그를 다음과 같이 사용하면 array_unique ()를 사용할 수 있습니다 :
array_unique($array, SORT_REGULAR);
이렇게하면 함수가 $ a == $ b를 사용하는 것처럼 요소를 비교하여 동일한 결과를 얻을 수 있습니다.
산출
Array ( [0] => Array ( [0] => abc [1] => def ) [1] => Array ( [0] => ghi [1] => jkl ) [2] => Array ( [0] => mno [1] => pql ) )
그러나 설명서에는 다음과 같은 내용이 명시되어 있습니다.
-
==============================
3.
비슷한 문제가 있었지만 100 % 작동하는 해결책을 찾았습니다.
<?php function super_unique($array,$key) { $temp_array = []; foreach ($array as &$v) { if (!isset($temp_array[$v[$key]])) $temp_array[$v[$key]] =& $v; } $array = array_values($temp_array); return $array; } $arr=""; $arr[0]['id']=0; $arr[0]['titel']="ABC"; $arr[1]['id']=1; $arr[1]['titel']="DEF"; $arr[2]['id']=2; $arr[2]['titel']="ABC"; $arr[3]['id']=3; $arr[3]['titel']="XYZ"; echo "<pre>"; print_r($arr); echo "unique*********************<br/>"; print_r(super_unique($arr,'titel')); ?>
-
==============================
4.
또 다른 방법. 열쇠도 보존합니다.
function array_unique_multidimensional($input) { $serialized = array_map('serialize', $input); $unique = array_unique($serialized); return array_intersect_key($input, $unique); }
-
==============================
5.
array_unique () 문서에 대한 사용자 의견에는 이에 대한 많은 해결책이 있습니다. 다음은 그 중 하나입니다.
이것은 http://ca3.php.net/manual/en/function.array-unique.php#57202에서 발췌 한 것입니다.
-
==============================
6.
"중복 제거"가 "중복 제거는하지만 그 중 하나는 제거"를 의미하는 경우 솔루션은 먼저 "식별자 열"에 array_unique (...)를 적용한 다음 원래 배열에서 모든 키를 제거하는 것일 수 있습니다 열 배열에서 제거되었습니다.
$array = [ [ 'id' => '123', 'foo' => 'aaa', 'bar' => 'bbb' ], [ 'id' => '123', 'foo' => 'ccc', 'bar' => 'ddd' ], [ 'id' => '567', 'foo' => 'eee', 'bar' => 'fff' ] ]; $ids = array_column($array, 'id'); $ids = array_unique($ids); $array = array_filter($array, function ($key, $value) use ($ids) { return in_array($value, array_keys($ids)); }, ARRAY_FILTER_USE_BOTH);
결과는 다음과 같습니다.
Array ( [0] => Array ( [id] => 123 [foo] => aaa [bar] => bbb ) [2] => Array ( [id] => 567 [foo] => eee [bar] => fff ) )
-
==============================
7.
두 번째 매개 변수로 SORT_REGULAR 옵션을 사용하십시오.
$uniqueArray = array_unique($array, SORT_REGULAR);
-
==============================
8.
mysqli id와 같은 특정 키에서 중복을 제거해야하는 경우 여기에 간단한 funciton이있다.
function search_array_compact($data,$key){ $compact = []; foreach($data as $row){ if(!in_array($row[$key],$compact)){ $compact[] = $row; } } return $compact; }
보너스 포인트 키의 배열을 전달하고 외부 foreach를 추가 할 수 있지만 추가 키당 2 배 더 느립니다.
-
==============================
9.
다음과 같은 배열을 가지고 있다면 :
(users는 배열의 이름 임)
Array=> [0] => (array) 'user' => 'john' 'age' => '23' [1] => (array) 'user' => 'jane' 'age' => '20' [2]=> (array) 'user' => 'john' 'age' => '23'
중복을 삭제하려면 ... 다음을 수행하십시오.
$serialized = array(); for ($i=0; $i < sizeof($users); $i++) { $test = in_array($users['user'], $serialized); if ($test == false) { $serialized[] = $users['user']; } }
해결책이 될 수 있습니다 : P
-
==============================
10.
Array ( [0] => Array ( [id] => 1 [name] => john ) [1] => Array ( [id] => 2 [name] => smith ) [2] => Array ( [id] => 3 [name] => john ) [3] => Array ( [id] => 4 [name] => robert ) ) $temp = array_unique(array_column($array, 'name')); $unique_arr = array_intersect_key($array, $temp);
그러면 배열에서 중복 된 이름이 제거됩니다. 열쇠로 유일한
-
==============================
11.
읽기 쉬운 솔루션, 아마도 가장 효율적인 것은 아닙니다 :
function arrayUnique($myArray){ if(!is_array($myArray)) return $myArray; foreach ($myArray as &$myvalue){ $myvalue=serialize($myvalue); } $myArray=array_unique($myArray); foreach ($myArray as &$myvalue){ $myvalue=unserialize($myvalue); } return $myArray; }
-
==============================
12.
다중 차원 배열을 고유하게 만드는 매우 쉽고 논리적 인 방법은 다음과 같습니다.
다음과 같은 배열이 있다면 :
Array ( [Key1] => Array ( [0] => Value1 [1] => Value2 [2] => Value1 [3] => Value3 [4] => Value1 ) [Key2] => Array ( [0] => Value1 [1] => Value2 [2] => Value1 [3] => Value3 [4] => Value4 ) )
foreach를 사용하여이 문제를 해결하십시오.
foreach($array as $k=>$v){ $unique=array_unique($v); $array[$k]=$unique; }
그것은 당신에게 다음과 같은 결과를 줄 것이다 :
Array ( [Key1] => Array ( [0] => Value1 [1] => Value2 [3] => Value3 ) [Key2] => Array ( [0] => Value1 [1] => Value2 [3] => Value3 [4] => Value4 ) )
그리고 당신이 키의 순서를 재 배열하고자한다면,
foreach($array as $k=>$v){ $unique= array_values(array_unique($v)); $array[$k]=$unique; }
이 작업은 다음과 같이 정렬 된 키 값을 제공합니다.
Array ( [Key1] => Array ( [0] => Value1 [1] => Value2 [2] => Value3 ) [Key2] => Array ( [0] => Value1 [1] => Value2 [2] => Value3 [3] => Value4 ) )
이 모든 일이 끝나기를 바랍니다.
-
==============================
13.
직렬화하고 고유 한 대안
$ 테스트 = [ [ 'abc', 'def'], [ 'ghi', 'jkl'], [ 'mno', 'pql'], [ 'abc', 'def'], [ 'ghi', 'jkl'], [ 'mno', 'pql'], ]; $ result = array_reduce ( $ 테스트, 함수 ($ 캐리, $ 항목) { if (! in_array ($ item, $ carry)) { array_push ($ 캐리, $ 항목); } return $ carry; }, [] ); var_dump ($ result); / * PHP는 unique.php 배열 (3) { [0] => 배열 (2) { [0] => 문자열 (3) "abc" [1] => 문자열 (3) "def" } [1] => 배열 (2) { [0] => 문자열 (3) "ghi" [1] => 문자열 (3) "jkl" } [2] => 배열 (2) { [0] => string (3) "mno" [1] => 문자열 (3) "pql" } } * /
-
==============================
14.
이런 배열이 있다면
data = array ( [0] => array ( [subject] => a [object] => c ), [1] => array ( [subject] => b [object] => d ), [2] => array ( [subject] => d [object] => b ), [3] => array ( [subject] => d [object] => c ), [4] => array ( [subject] => c [object] => a ), [5] => array ( [subject] => c [object] => d ) )
다음과 같은 배열을 원한다.
data = array ( [0] => array ( [subject] => a [object] => c ), [1] => array ( [subject] => b [object] => d ), [2] => array ( [subject] => d [object] => c ) )
또는
data = array ( [0] => array ( [subject] => d [object] => b ), [1] => array ( [subject] => c [object] => a ), [2] => array ( [subject] => c [object] => d ) )
다음 코드가 도움이 될 수 있습니다.
$data1 = array(); $data1 = $data; for($q=0;$q<count($data);$q++) { for($p=0;$p<count($data1);$p++) { if (($data[$q]["subject"] == $data1[$p]["object"]) && ($data[$q]["object"] == $data1[$p]["subject"])) { $data1[$p]["subject"] = $data[$q]["subject"]; $data1[$p]["object"] = $data[$q]["object"]; } } } $data1 = array_values(array_map("unserialize", array_unique(array_map("serialize", $data1)))); $data = $data1;
-
==============================
15.
이 문제에 많은 생각을하고 최적의 솔루션은 두 가지 규칙을 따라야한다고 판단했습니다.
이를 염두에두고 PHP의 모든 단점을 고려할 때, 내가 생각해 낸 해결책은 다음과 같다. 다른 답변 들과는 달리, 그것은 당신이 원하는 어떤 키 (들)을 기반으로 요소를 제거 할 수있는 능력을 가지고 있습니다. 입력 배열은 숫자 키로 예상됩니다.
$count_array = count($input); for ($i = 0; $i < $count_array; $i++) { if (isset($input[$i])) { for ($j = $i+1; $j < $count_array; $j++) { if (isset($input[$j])) { //this is where you do your comparison for dupes if ($input[$i]['checksum'] == $input[$j]['checksum']) { unset($input[$j]); } } } } }
단점은 반복이 완료 될 때 키가 순서대로 정렬되지 않는다는 것입니다. 후속 적으로 foreach 루프 만 사용하는 경우에는 문제가되지 않지만 for 루프를 사용해야하는 경우 $ input = array_values ($ input); 위의 키를 다시 번호 매기기.
-
==============================
16.
사람들이 array_unique ()가 매우 느린다고 말하면서 여기에 한 레벨의 다차원 배열에 사용하는 스 니펫이 있습니다.
$serialized_array = array_map("serialize", $input); foreach ($serialized_array as $key => $val) { $result[$val] = true; } $output = array_map("unserialize", (array_keys($result)));
첫 번째 사용자가 php.net의 array_unique () 함수 페이지를 참조했다.
-
==============================
17.
많은 사람이 나에게 고유 다차원 배열을 만드는 법을 물었습니다. 나는 당신의 의견에서 참고를 가지고 가고 저를 돕는다.
우선, @ jeromegamez @ daveilers에게 감사드립니다. 그러나 내가 대답을 할 때마다, 그들은 어떻게이 '연재'와 '비 직렬화'가 작동 하는지를 물었다. 그래서 나는이 이유를 당신과 공유하여 더 많은 사람들이이 배경의 개념을 이해하는 데 도움이 될 것입니다.
나는 왜 우리가 'serialize'하고 'unserialize'를 사용하는지 설명하고 있습니다.
1 단계 : 다차원 배열을 1 차원 배열로 변환
다차원 배열을 1 차원 배열로 변환하려면 먼저 배열 내부의 모든 요소 (중첩 배열 포함)의 바이트 스트림 표현을 생성합니다. serialize () 함수는 값의 바이트 스트림 표현을 생성 할 수 있습니다. 모든 요소의 바이트 스트림 표현을 생성하려면 array_map () 함수 내에서 serialize () 함수를 콜백 함수로 호출하십시오. 결과는 다차원 배열의 레벨 수에 관계없이 1 차원 배열이됩니다.
2 단계 : 고유 한 값 만들기
이 1 차원 배열을 고유하게 만들려면 array_unique () 함수를 사용하십시오.
3 단계 : 다차원 배열로 되돌립니다.
배열은 이제 고유하지만 값은 바이트 스트림 표현과 비슷합니다. 다시 다차원 배열로 되돌리려면 unserialize () 함수를 사용하십시오.
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
이 모든 것에 다시 한 번 감사드립니다.
from https://stackoverflow.com/questions/307674/how-to-remove-duplicate-values-from-a-multi-dimensional-array-in-php by cc-by-sa and MIT lisence
'PHP' 카테고리의 다른 글
참조 - PDO에 대해 자주 묻는 질문 (0) | 2018.09.02 |
---|---|
다차원 배열을 단순화하는 방법? (0) | 2018.09.02 |
PHP에서 HTML / XML을 구문 분석하고 처리하는 방법은 무엇입니까? (0) | 2018.09.02 |
PHP에서 유용한 오류 메시지를 얻는 방법? (0) | 2018.09.02 |
HTML / PHP로 XSS를 방지하는 방법? (0) | 2018.09.02 |