user3066006
user3066006

Reputation: 149

Remove duplicate values having same key in a mulit dimensional array and store the unique values to another array

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

Answers (4)

viral
viral

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

IshaS
IshaS

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

Akshay Hegde
Akshay Hegde

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

Ronald Swets
Ronald Swets

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

Related Questions