In my opinion it's better to use a foreach() then a for().
The approach with the foreach() looks cleaner to me. The approach with the for() is not wrong, but it's strange.
See the example with a foreach:
$z = array('xxApple' => "itema", 'B' => "itemb", 'C' => "itemc", 'D' => "itemd", 'AAAA' => "iteme");
//$z = array("itema", "itemb", "itemc", "itemd", "iteme"); // works also with this array
$x = array_values($z);
$y = array_keys($z); // Optional
foreach($x as $key1 => $item){
foreach($x as $key2 => $item2){
if($key2 <= $key1){
continue;
}
if($item == $item2){
continue;
}
echo $item . ' vs ' . $item2 . '<br>';
// echo $y[$key1] . ' vs ' . $y[$key2] . '<br>'; // Optional
}
}
//OUTPUT
itema vs itemb
itema vs itemc
itema vs itemd
itema vs iteme
itemb vs itemc
itemb vs itemd
itemb vs iteme
itemc vs itemd
itemc vs iteme
itemd vs iteme
Here are the benchmark results:
Benchmark #1
$z = range(0,20000);
$start = time();
$values = array_values($z);
for ($i = 0; $i < count($values) - 1; $i++) {
for ($j = $i + 1; $j < count($values); $j++) {
}
}
$end = time();
$elapsedTimeA = $end - $start;
// Case A, elapsed time in seconds: 275
echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;
$start = time();
$x = array_values($z);
foreach($x as $key1 => $item){
foreach($x as $key2 => $item2){
if($key2 <= $key1){
continue;
}
if($item == $item2){
continue;
}
}
}
$end = time();
$elapsedTimeB = $end - $start;
// Case B, elapsed time in seconds: 103
echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;
Benchmark #2
$z = range(0,20000);
$start = time();
$values = array_values($z);
$count = count($values);
for ($i = 0; $i < $count - 1; $i++) {
for ($j = $i + 1; $j < $count; $j++) {
}
}
$end = time();
$elapsedTimeA = $end - $start;
// Case A, elapsed time in seconds: 17
echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;
$start = time();
$x = array_values($z);
foreach($x as $key1 => $item){
foreach($x as $key2 => $item2){
if($key2 <= $key1){
continue;
}
if($item == $item2){
continue;
}
}
}
$end = time();
$elapsedTimeB = $end - $start;
// Case B, elapsed time in seconds: 103
echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;