Reputation: 149
I have an array
Array([0]=>Array
(
[a]=>'street1'
[b]=>'area1'
[c]=>'zip1'
)
[1]=>Array
(
[a]=>'street2'
[b]=>'area1'
[c]=>'zip1'
(
[2]=>Array
(
[a]=>'street3'
[b]=>'area1'
[c]=>'zip2'
(
)
here what I would like to do is, remove the duplicate values for the same key and store the remaining unique values like below in to another array
Array([a]=>Array('street1','street2','street3')
[b]=>Array('area1')
[c]=>Array('zip1','zip2')
)
I tried doing this with array merge and some foreach loops and it really got messy. Could someone help me out with this.
Upvotes: 2
Views: 134
Reputation: 3743
Consider this as input
$input = [
['a' => 'street1', 'b' => 'area1', 'c' => 'zip1'],
['a' => 'street2', 'b' => 'area1', 'c' => 'zip1'],
['a' => 'street3', 'b' => 'area1', 'c' => 'zip2']
];
Using array_walk()
array_walk($input, function($v) use(&$final){
array_walk($v, function($val, $key, $v) use(&$final){
$final[$key][] = $v[$key];
}, $v);
});
$final = array_map('array_values', array_map('array_unique', $final));
Using foreach
foreach($input as $array)
{
foreach($array as $key => $val)
{
$final[$key][] = $array[$key];
}
} unset($array, $key, $val);
$final = array_map('array_values', array_map('array_unique', $final));
Your $final
output in both cases,
array (size=3)
'a' =>
array (size=3)
0 => string 'street1' (length=7)
1 => string 'street2' (length=7)
2 => string 'street3' (length=7)
'b' =>
array (size=1)
0 => string 'area1' (length=5)
'c' =>
array (size=2)
0 => string 'zip1' (length=4)
1 => string 'zip2' (length=4)
Upvotes: 2
Reputation: 837
$arr = array(
array('a'=>'street1', 'b'=>'area1', 'c'=>'zip1'),
array('a'=>'street2', 'b'=>'area1', 'c'=>'zip1'),
array('a'=>'street3', 'b'=>'area1', 'c'=>'zip2')
);
$new = array();
foreach($arr as $a){
foreach($a as $key=>$value){
if(array_key_exists($key,$new)){
if(!in_array($value,$new[$key])){
array_push($new[$key],$value);
}
}
else{
$new[$key][] = $value;
}
}
}
var_dump($new);
Output
array(3) {
["a"]=>
array(3) {
[0]=>
string(7) "street1"
[1]=>
string(7) "street2"
[2]=>
string(7) "street3"
}
["b"]=>
array(1) {
[0]=>
string(5) "area1"
}
["c"]=>
array(2) {
[0]=>
string(4) "zip1"
[1]=>
string(4) "zip2"
}
}
Upvotes: 1
Reputation: 16997
[akshay@localhost tmp]$ cat test.php
<?php
$array = array( array('a'=>'street1','b'=>'area1','c'=>'zip1'),array('a'=>'street2','b'=>'area1','c'=>'zip1'),array('a'=>'street3','b'=>'area1','c'=>'zip2'));
foreach($array as $v)
{
foreach($v as $p => $q)
{
if(!isset($output[$p]))
{
$output[$p][] = $q;
continue;
}
if(!in_array($q,$output[$p]))
$output[$p][] = $q;
}
}
// Input
print_r($array);
//Output
print_r($output);
?>
Output
[akshay@localhost tmp]$ php test.php
Array
(
[0] => Array
(
[a] => street1
[b] => area1
[c] => zip1
)
[1] => Array
(
[a] => street2
[b] => area1
[c] => zip1
)
[2] => Array
(
[a] => street3
[b] => area1
[c] => zip2
)
)
Array
(
[a] => Array
(
[0] => street1
[1] => street2
[2] => street3
)
[b] => Array
(
[0] => area1
)
[c] => Array
(
[0] => zip1
[1] => zip2
)
)
Upvotes: 2
Reputation: 1667
Try this:
$input = array(
array('a'=>'street1', 'b'=>'area1', 'c'=>'zip1'),
array('a'=>'street2', 'b'=>'area1', 'c'=>'zip1'),
array('a'=>'street3', 'b'=>'area1', 'c'=>'zip2')
);
$result = array();
foreach($input as $address) {
foreach($address as $field=>$value) {
if (!isset($result[$field])) $result[$field] = array();
$result[$field][] = $value;
}
}
foreach($result as $key=>$values) {
$result[$key] = array_unique($values);
}
You could check if a value exists before adding it instead of using array_unique afterwards. Depending on the data size it would save up memory.
i.e:
$result = array();
foreach($input as $address) {
foreach($address as $field=>$value) {
if (!isset($result[$field])) $result[$field] = array();
if (!in_array($value, $result[$field])) {
$result[$field][] = $value;
}
}
}
Upvotes: 2