php array_unique not working as expected
Asked Answered
A

2

6

I am trying to learn how to use array_unique, so I made some sample code and I didn't get what I expected.

$array[0] = 1;
$array[1] = 5;
$array[2] = 2;
$array[3] = 6;
$array[4] = 3;
$array[5] = 3;
$array[6] = 7;
$uniques = array_unique($array, SORT_REGULAR);
for($i = 0; $i < count($uniques); $i++)
    echo $uniques[$i];

For example this gives me the output of '15263' but not 7. After a few test I think that it stops looking after it finds the first duplicate. Is that what is supposed to happen?

Archaeopteryx answered 13/2, 2014 at 19:1 Comment(0)
C
10

Reason for $uniques output is

 Array
(
    [0] => 1
    [1] => 5
    [2] => 2
    [3] => 6
    [4] => 3
    [6] => 7
)

Your array doesn't contain key 5, but in your for loop echo $uniques[$i]; not hold the value of echo $uniques[5];. that is the reason value 7 is missing.

Try this,

foreach($uniques as $unique){
   echo $unique;
}

instead of

 for($i = 0; $i < count($uniques); $i++)

OR, you can re-index the array using array_values($uniques) and use,

  $uniques = array_values($uniques);
  for($i = 0; $i < count($uniques); $i++)
   echo $uniques[$i];
Coping answered 13/2, 2014 at 19:6 Comment(2)
Your array value doesn't contain key 5, thats whyCoping
Why doesn't it contain 5? That's the question that needs to be addressed. Here's the answer: It is because array_unique() preserves keys. The documentation states: Note that keys are preserved. Since you're using a for loop which operates on the array on the basis of numeric indexes, a missing position in the array will mean that it will not get echoed. Had you enabled error reporting, you'd have seen an error message saying Undefined offset.Loganiaceous
S
10

Since array_unique preserves the keys, you can’t access the array $uniques properly with a for loop. Either use a foreach loop or change the seventh line of your code to:

$uniques = array_values(array_unique($array, SORT_REGULAR));
Snowclad answered 13/2, 2014 at 19:3 Comment(2)
@mucle6: It is because the $uniques array keys are not continuous. You need to re-index it for the for loop to work: eval.in/101407Loganiaceous
@AmalMurali Sorry, I had to write this answer in a hurry and leave StackOverflow immediately afterwards, so there was no scope to update my answer and make it more lucid/elaborate. Now I’m glad to see that the accepted answer and your comments have said all I had to say (and more than that, indeed). Thank you especially for the precious demo.Snowclad
C
10

Reason for $uniques output is

 Array
(
    [0] => 1
    [1] => 5
    [2] => 2
    [3] => 6
    [4] => 3
    [6] => 7
)

Your array doesn't contain key 5, but in your for loop echo $uniques[$i]; not hold the value of echo $uniques[5];. that is the reason value 7 is missing.

Try this,

foreach($uniques as $unique){
   echo $unique;
}

instead of

 for($i = 0; $i < count($uniques); $i++)

OR, you can re-index the array using array_values($uniques) and use,

  $uniques = array_values($uniques);
  for($i = 0; $i < count($uniques); $i++)
   echo $uniques[$i];
Coping answered 13/2, 2014 at 19:6 Comment(2)
Your array value doesn't contain key 5, thats whyCoping
Why doesn't it contain 5? That's the question that needs to be addressed. Here's the answer: It is because array_unique() preserves keys. The documentation states: Note that keys are preserved. Since you're using a for loop which operates on the array on the basis of numeric indexes, a missing position in the array will mean that it will not get echoed. Had you enabled error reporting, you'd have seen an error message saying Undefined offset.Loganiaceous

© 2022 - 2024 — McMap. All rights reserved.