Reputation: 1851
I need to check the 2D array($arr) for any duplicates(order does not matter) and put them into a clean array.
For example:
$arr = array (
array (-9,1,8 ),
array (-9,2,7 ),
array (-9,3,6 ),
array (-9,4,5 ),
array (-9,5,4 ),
array (-9,6,3 ),
array (-9,7,2 ),
array (-9,8,1 )
)
needs to be end up being:
$cleanArr = array (
array (-9,1,8 ),
array (-9,2,7 ),
array (-9,3,6 ),
array (-9,4,5 )
)
or
$cleanArr = array(
array (-9,5,4 ),
array (-9,6,3 ),
array (-9,7,2 ),
array (-9,8,1 )
)
Is there a PHP function for this or do I need to do some sort of loop to clean out the duplicates?
Upvotes: 4
Views: 788
Reputation: 7791
Try this:
<?php
$arr = array (
array (-9,1,8 ),
array (-9,2,7 ),
array (-9,3,6 ),
array (-9,4,5 ),
array (-9,5,4 ),
array (-9,6,3 ),
array (-9,7,2 ),
array (-9,8,1 )
);
$arr = array_map(function($n) {return explode(',', $n);}, (array_unique(array_map(function($n) {sort($n); return implode(',', $n);}, $arr))));
echo var_export($arr, true);
?>
Output:
array (
0 =>
array (
0 => '-9',
1 => '1',
2 => '8',
),
1 =>
array (
0 => '-9',
1 => '2',
2 => '7',
),
2 =>
array (
0 => '-9',
1 => '3',
2 => '6',
),
3 =>
array (
0 => '-9',
1 => '4',
2 => '5',
),
)
Upvotes: 0
Reputation: 41885
No function does this outright, you could use a combination of functions though. You could first sort all of sub batches of array first into ascending order first, then serialize each on them, utilize array_unique
, then unserialize again to have that multi dimensional again:
foreach($arr as &$a){ sort($a); }
$arr = array_map('unserialize', array_unique(array_map('serialize', $arr)));
print_r($arr);
Upvotes: 5