PHP의 다차원 배열에서 중복된 값을 제거하는 방법
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
)
)
여기 다른 방법이 있다.중간 변수는 저장되지 않습니다.
이를 사용하여 다양한 중복되는 쿼리에서 결과를 중복 제거했습니다.
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
5.2.9 이후를 사용하면SORT_REGULAR
하다
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
)
)
다만, 메뉴얼에는 다음의 내용이 기재되어 있는 것에 주의해 주세요.
array_unique()
는 다차원 어레이에서는 동작하지 않습니다.
저도 비슷한 문제가 있었지만 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'));
?>
다른 방법으로.키도 유지됩니다.
function array_unique_multidimensional($input)
{
$serialized = array_map('serialize', $input);
$unique = array_unique($serialized);
return array_intersect_key($input, $unique);
}
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);
그러면 중복된 이름이 배열에서 제거됩니다.키별 고유
제거'가 ' 제거'를의미할 경우, ' 제거'를 '복제 제거'로 .array_unique(...)
column"에서한 후합니다.
$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
)
)
array_unique() 문서의 사용자 코멘트에는 이에 대한 많은 솔루션이 있습니다.그 중 하나를 다음에 나타냅니다.
dot comrbnsn kenrbnsn
12:092005 †7 인치 27 인치12:09또 다른 어레이는 멀티 감압 어레이에 고유한 어레이입니다.이 테스트는 2감압 어레이에서만 실시했습니다만, 더 많은 용도로 일반화할 수도 있고 재귀를 사용할 수도 있습니다.
이 함수는 serialize, array_unique 및 unserialize 함수를 사용하여 작업을 수행합니다.
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); }
이것은 http://ca3.php.net/manual/en/function.array-unique.php#57202 에서 온 것입니다.
mysqli ID와 같은 특정 키의 중복을 제거할 필요가 있는 경우, 여기 간단한 함수가 있습니다.
function search_array_compact($data,$key){
$compact = [];
foreach($data as $row){
if(!in_array($row[$key],$compact)){
$compact[] = $row;
}
}
return $compact;
}
보너스 포인트 키 배열을 전달하고 외부 포어치를 추가할 수 있지만 추가 키당 속도가 2배 느립니다.
다음과 같은 어레이가 있는 경우:
(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
많은 분들이 유니크한 다차원 배열을 어떻게 만드냐고 물어보셨어요.당신의 코멘트를 참고해서 도움이 되었습니다.
먼저 @jeromegamez @daveiler 님의 솔루션에 감사드립니다.하지만 매번 답을 줄 때마다 '직렬화'와 '직렬화 해제'가 어떻게 작동하는지 물어봤어요.그래서 더 많은 사람들이 이 개념을 이해하는 데 도움이 될 수 있도록 그 이유를 여러분과 공유하고 싶습니다.
순서에서는, 「시리얼라이즈」와 「시리얼라이즈 해제」를 사용하는 이유를 설명합니다.
순서 1: 다차원 어레이를 1차원 어레이로 변환합니다.
다차원 배열을 1차원 배열로 변환하려면 먼저 배열 내의 모든 요소(네스트된 배열 포함)의 바이트 스트림 표현을 생성합니다.serialize() 함수는 값의 바이트 스트림 표현을 생성할 수 있습니다.모든 요소의 바이트 스트림 표현을 생성하려면 array_map() 내의 call serialize() 함수를 콜백 함수로 사용합니다.그 결과 다차원 배열의 레벨 수에 관계없이 1차원 배열이 됩니다.
2단계: 값을 고유하게 하다
이 1차원 배열을 고유하게 만들려면 array_unique() 함수를 사용합니다.
순서 3: 다차원 배열로 되돌리기
배열이 고유하지만 값은 바이트 스트림 표현과 비슷합니다.이를 다차원 배열로 되돌리려면 unserialize() 함수를 사용합니다.
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
다시 한 번 감사드립니다.
다차원 어레이를 고유하게 만드는 매우 쉽고 논리적인 방법은 다음과 같습니다.
다음과 같은 어레이가 있는 경우:
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
)
)
이것으로 모든 것이 해결되기를 바랍니다.
읽기 쉬운 솔루션, 아마 가장 효율적이지 않을 것입니다.
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;
}
들 말하는 array_unique()
우우느느느느다다여기에서는 1레벨의 다차원 어레이에 사용하는 스니펫을 보여드릴게요
$serialized_array = array_map("serialize", $input);
foreach ($serialized_array as $key => $val) {
$result[$val] = true;
}
$output = array_map("unserialize", (array_keys($result)));
입니다.array_unique()
php.net의
시리얼라이즈 및 유니크한 대체 수단
$test = [
['abc','def'],
['ghi','jkl'],
['mno','pql'],
['abc','def'],
['ghi','jkl'],
['mno','pql'],
];
$result = array_reduce(
$test,
function($carry,$item){
if(!in_array($item,$carry)) {
array_push($carry,$item);
}
return $carry;
},
[]
);
var_dump($result);
/*
php unique.php
array(3) {
[0] =>
array(2) {
[0] =>
string(3) "abc"
[1] =>
string(3) "def"
}
[1] =>
array(2) {
[0] =>
string(3) "ghi"
[1] =>
string(3) "jkl"
}
[2] =>
array(2) {
[0] =>
string(3) "mno"
[1] =>
string(3) "pql"
}
}
*/
나는 이 문제에 대해 많은 생각을 했고 최적의 해결책은 두 가지 규칙을 따라야 한다고 결정했다.
- 확장성을 확보하기 위해 어레이를 새로운 어레이로 복사하지 않고 그대로 변경
- 퍼포먼스를 위해 각 비교는 1회만 실시합니다.
그것을 염두에 두고, 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]);
}
}
}
}
}
유일한 단점은 반복이 완료되었을 때 키가 순서대로 되어 있지 않다는 것입니다.루프만 에는 문제가 되지 , 에는 포어치 루프를 할 수 있습니다.$input = array_values($input);
는 키 번호를 변경한다에 위의 후.
non-restricted 길이에(n)차원 배열에 대해 이 해결책은 해 보세요.
예를 들어 이 배열
$arr= [
0 => [0=>"a" , 1=>"b" , 2=>"c" ] ,
1 => [0=>"x" , 1=>"b" , 2=>"a", 3=>"p"],
2=> [
[
0=>"y" ,
1=>"b" ,
2=> [0=>"x" , 1=>"m" , 2=>"a"]
],
1=>"z" ,
2=>"v"
]
];
이것은 해결책이다.
$ar2=[];
$ar3=[];
function test($arr){
global $ar2,$ar3;
if(is_array($arr)){
return array_map("test",$arr);
}
if(!isset($ar2[$arr])){
$ar2[$arr]=1;
$ar3[]=$arr;
}
}
array_map("test",$arr);
print_r($ar3);
그 대답에 기초한 정답으로, 제 대답은 추가했다.작은 코드만 indices-를 재설정하는 것이라고 덧붙였다.
$input = array_values(array_map("unserialize", array_unique(array_map("serialize", $inputArray))));
언급URL:https://stackoverflow.com/questions/307674/how-to-remove-duplicate-values-from-a-multi-dimensional-array-in-php
'programing' 카테고리의 다른 글
코드 시그니터 - 입력 파일이 지정되지 않았습니다. (0) | 2022.09.21 |
---|---|
같은 테이블에 여러 명이 끼지 않도록 하려면 어떻게 해야 할까요? (0) | 2022.09.21 |
Vue 유닛 테스트 - vue-test-utils 마운트를 사용할 때 Import된 서비스를 조롱합니다. (0) | 2022.09.21 |
mysqldump를 시도할 때 "mysqldump 변수 'key_buffer_size=256M"이 표시됩니다. (0) | 2022.09.21 |
'다른 테이블을 스토리지 엔진에 커밋' 상태에서 쿼리를 롤백할 수 있습니까? (0) | 2022.09.21 |