Strange php array_unique behavior

I use the following code to output the array:

echo "======output without array_unique=====";
var_dump($selected);
echo "=====output with array_unique=====";
var_dump(array_unique($selected));die;                

And the result:

======output without array_unique=====

array
  0 => 
    array
      'uri' => string 'http://localhost/conferences/tags/0caf4c990e0a385156b33fee58e7e3fb' (length=63)
      'tag' => string '1' (length=1)
      'weight' => float 4
      'selected' => string 'select' (length=6)
  1 => 
    array
      'uri' => string 'http://localhost/conferences/tags/0caf4c990e0a385156b33fee58e7e3fb' (length=63)
      'tag' => string '1' (length=1)
      'weight' => float 4
      'selected' => string 'select' (length=6)
  2 => 
    array
      'uri' => string 'http://localhost/conferences/tags/ffc709d5131f752df8aae22d7da4240f' (length=63)
      'tag' => string '2' (length=1)
      'weight' => float 4
      'selected' => string '' (length=0)
  3 => 
    array
      'uri' => string 'http://localhost/conferences/tags/035c60c7f090412cc905cee008fbeba8' (length=63)
      'tag' => string '3' (length=1)
      'weight' => float 0
      'selected' => string '' (length=0)
  4 => 
    array
      'uri' => string 'http://localhost/conferences/tags/4137dbc16ef1a2079eb6cacb62dd8521' (length=63)
      'tag' => string '4' (length=1)
      'weight' => float 0
      'selected' => string '' (length=0)

=====output with array_unique=====

array
  0 => 
    array
      'uri' => string 'http://localhost/conferences/tags/0caf4c990e0a385156b33fee58e7e3fb' (length=63)
      'tag' => string '1' (length=1)
      'weight' => float 4
      'selected' => string 'select' (length=6)

Can someone explain to me why I get an array with only one element from array_unique?

+3
source share
4 answers

Array elements are passed to strings for comparison - here is the corresponding fragment from the manual page for array_unique

Note: two elements are considered equal if and only if (string) $ elem1 === (string) $ elem2. In words: when the string representation is the same. The first element will be used.

, , "", , , , .

,

$seen=array();
foreach ($myarray as $key=>$val) {
    if (isset($seen[$val['uri']])) {
        unset($myarray[$key]);    // remove duplicate
    } else {
        $seen[$val['uri']]=$key;  // remember this
    }
}
unset($seen); // don't need this any more
+11

, $selected , $selected [0] $selected [1], .

, array_unique tests (string) $value1 === (string) $value2, 'Array' == 'Array'.

, "" (URI?). , $selected, ( serialize()), array_unique . unserialize, .

<?php

function multi_array_unique($arr) {
    foreach ($arr as &$elm) {
        $elm = serialize($elm);
    }

    $arr = array_unique($arr);

    foreach ($arr as &$elm) {
        $elm = unserialize($elm);
    }

    return $arr;
}

?>

, , .

: http://codepad.org/6cs5b0sm

+3

array_unique , . "Array", .

, "Array" , .

array_unique, , "uri" .

+2

If the elements of the array are already sorted, you can find unique values:

$unique = array();
$n = count($array);
if ($n < 2) {
    $unique = $array;
} else {
    for ($i=0; $i<$n-1; ++$i) {
        $unique[] = $array[$i];
        if ($array[$i] === $array[$i+1]) {
            ++$i;
        }
    }
    if ($i < $n && $array[$n-2] !== $array[$n-1]) {
        $unique[] = $array[$n-1];
    }
}
0
source

Source: https://habr.com/ru/post/1717324/


All Articles