I have an array in PHP that looks like this:
[0]=>
array(2) {
[\"name\"]=>
string(9) \"My_item\"
[\"url\"]
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)));
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;
}
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/"
Please find this link useful, uses 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
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');
basically
foreach($your_array as $element) {
$hash = $element[field-that-should-be-unique];
$unique_array[$hash] = $element;
}