16

I have an array in PHP that looks like this:

  [0]=>
       array(2) {
           ["name"]=>
              string(9) "My_item"
           ["url"]=>
              string(24) "http://www.my-url.com/"
       }
  [1]=>
     array(2) {
         ["name"]=>
             string(9) "My_item"
         ["url"]=>
            string(24) "http://www.my-url2.com/"
     }

The two values in "name" are the same in this two items. I want to sort out duplicates like this.

How do I create an unique array by checking the "name" value?

4
  • 2
    What array do you want to end up with? Given the two values for URL are different, does one of them have to go? If so, how would you determine which to lose? Commented Jun 21, 2011 at 8:46
  • 1
    stackoverflow.com/questions/6417352/… About objects, but beside this exactly the same Commented Jun 21, 2011 at 8:47
  • Have a look at the PHP-ARRAY-UNIQUE function. Commented Jun 21, 2011 at 8:48
  • Can you show the result you expect? Commented Jun 21, 2011 at 8:51

6 Answers 6

32

Basically

$unique_array = [];
foreach($your_array as $element) {
    $hash = $element[field-that-should-be-unique];
    $unique_array[$hash] = $element;
}
$result = array_values($unique_array);
Sign up to request clarification or add additional context in comments.

Comments

21

Serialisation is very useful for simplifying the process of establishing the uniqueness of a hierarchical array. Use this one liner to retrieve an array containing only unique elements.

$unique = array_map("unserialize", array_unique(array_map("serialize", $input)));

Comments

1

Please find this link useful. It uses an MD5 hash to examine the duplicates:

http://www.phpdevblog.net/2009/01/using-array-unique-with-multidimensional-arrays.html

Quick Glimpse:

/**
 * Create Unique Arrays using an md5 hash
 *
 * @param array $array
 * @return array
 */
function arrayUnique($array, $preserveKeys = false)
{
    // Unique Array for return
    $arrayRewrite = array();
    // Array with the md5 hashes
    $arrayHashes = array();
    foreach($array as $key => $item) {
        // Serialize the current element and create a md5 hash
        $hash = md5(serialize($item));
        // If the md5 didn't come up yet, add the element to
        // to arrayRewrite, otherwise drop it
        if (!isset($arrayHashes[$hash])) {
            // Save the current element hash
            $arrayHashes[$hash] = $hash;
            // Add element to the unique Array
            if ($preserveKeys) {
                $arrayRewrite[$key] = $item;
            } else {
                $arrayRewrite[] = $item;
            }
        }
    }
    return $arrayRewrite;
}

$uniqueArray = arrayUnique($array);
var_dump($uniqueArray);

See the working example here: http://codepad.org/9nCJwsvg

2 Comments

@Symcbean This works even if the value in the 2nd level are unique, not just first value. Why this doesnot address the question? It gives you the output, please see the working example.
Both links are broken.
-1

Simple Solution:

/**
 * @param $array
 * @param null $key
 * @return array
 */
public static function unique($array,$key = null){
    if(null === $key){
        return array_unique($array);
    }
    $keys=[];
    $ret = [];
    foreach($array as $elem){
        $arrayKey = (is_array($elem))?$elem[$key]:$elem->$key;
        if(in_array($arrayKey,$keys)){
            continue;
        }
        $ret[] = $elem;
        array_push($keys,$arrayKey);
    }
    return $ret;
}

Comments

-1
function unique_multidim_array($array, $key) { 
            $temp_array = array(); 
            $i = 0; 
            $key_array = array(); 

            foreach($array as $val) { 
                if (!in_array($val[$key], $key_array)) { 
                    $key_array[$i] = $val[$key]; 
                    $temp_array[$i] = $val; 
                } 
                $i++; 
            } 
            return $temp_array; 
        } 
$result = unique_multidim_array($visitors,'ip');

Comments

-5

Given that the keys on the array (0,1) do not seem to be significant a simple solution would be to use the value of the element referenced by 'name' as the key for the outer array:

["My_item"]=>
   array(2) {
       ["name"]=>
          string(9) "My_item"
       ["url"]=>
          string(24) "http://www.my-url.com/"
   }

...and if there is only one value other than the 'name' why bother with a nested array at all?

["My_item"]=>"http://www.my-url.com/"

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.