ID:               17307
 Updated by:       [EMAIL PROTECTED]
 Reported By:      [EMAIL PROTECTED]
 Status:           Feedback
 Bug Type:         Arrays related
 Operating System: Linux
 PHP Version:      4.2.1
 New Comment:

Please try latest snapshot from snaps.php.net , the problem is supposed
to be fixed there.


Previous Comments:
------------------------------------------------------------------------

[2002-05-31 05:04:37] [EMAIL PROTECTED]

I've hit the sort problem too... I tried to reproduce it in a few way
and I have to say that sometimes it seems to work (sort correctly) some
not... unfortunately I can only contribute with a complex routine I use
to sort site navigation menus (that it's the only one it always fails
on V4.2.1 and works happily in 4.0.6).

For the result: on the left side the table shows the tree as is (and is
already sorted) - on the right the same tree after sorting (that indeed
is not).

<?
 
$d = array(
  array(2, 0, 8, 1, 0, "branch A", "1", "12,8,0,0,0,0,0"),
  array(2, 0, 9, 1, 0, "branch B", "1", "12,9,0,0,0,0,0"),
  array(2, 0, 10, 1, 0, "branch C", "1", "12,10,0,0,0,0,0"),
  array(2, 0, 11, 1, 0, "branch D", "1", "12,11,0,0,0,0,0"),
  array(2, 0, 12, 1, 0, "branch E", "1", "12,12,0,0,0,0,0"),
  array(2, 0, 13, 1, 0, "branch F", "1", "12,13,0,0,0,0,0"),
  array(2, 0, 14, 1, 0, "branch G", "1", "12,14,0,0,0,0,0"),
  array(2, 0, 15, 1, 0, "branch H", "1", "12,15,0,0,0,0,0"),
  array(2, 0, 16, 1, 0, "branch I", "1", "12,16,0,0,0,0,0"),
  array(2, 0, 17, 1, 0, "branch J", "1", "12,17,0,0,0,0,0"),
  array(2, 0, 18, 1, 0, "branch K", "1", "12,18,0,0,0,0,0"),
  array(2, 0, 19, 1, 0, "branch L", "1", "12,19,0,0,0,0,0"),
  array(2, 0, 20, 1, 0, "branch M", "1", "12,20,0,0,0,0,0"),
  array(2, 0, 21, 1, 0, "branch N", "1", "12,21,0,0,0,0,0"),
  array(2, 0, 155, 1, 0, "branch O", "1", "12,155,0,0,0,0,0"),
  array(2, 0, 163, 1, 0, "branch P", "1", "12,163,0,0,0,0,0"),
  array(2, 0, 981, 1, 0, "branch Q", "1b", "12,981,0,0,0,0,0"),
  array(3, 0, 982, 981, 0, "under branch Q", "2",
"12,981,982,0,0,0,0"),
  array(3, 0, 983, 981, 0, "under branch Q too", "2",
"12,981,983,0,0,0,0")
);

function sort_level($a, $b) {
// sort navigation array
// indexes : [0] level, [1] order, [2] tree_id, [3] parent_id, [4]
parent_ord
// (unused)  [5] descr, [6] class, [7] navigation
 
  if ($a[0] == 2) {           // a at second level
 
    if ($b[0] == 2) {         // both a and b at second level
 
      if ($a[1] == $b[1]) {   // a and b at same level, same order
        if ($a[2] == $b[2]) { // same level, same order, same tree_id
(???)
          return 0;
        } else {              // return according to tree_id
          return ($a[2] > $b[2]) ? 1 : -1;
        }
      } else {                // return according to order (in same
level)
        return ($a[1] > $b[1]) ? 1 : -1;
      }
 
    } else {                  // a at second level, b at third

      if ($a[2] == $b[3]) {   // b is child of a
        return -1;
      } else {                // return according to a and b's parent
order
        return ($a[1] > $b[4]) ? 1 : -1;
      }
    }
 
  } else {                    // a at third level
 
    if ($b[0] == 3) {         // both a and b at third level
 
      if ($a[1] == $b[1]) {   // a and b at same level, same order
        if ($a[2] == $b[2]) { // same level, same order, same tree_id
(???)
          return 0;
        } else {              // return according to tree_id
          return ($a[2] > $b[2]) ? 1 : -1;
        }
      } else {                // return according to order (in same
level)
        return ($a[1] > $b[1]) ? 1 : -1;
      }
 
    } else {                  // b at second level, a at third
      if ($a[3] == $b[2]) {   // a is child of b
        return 1;
      } else {                // return according to a's parent and b
order
        return ($a[4] > $b[1]) ? 1 : -1;
      }
 
    }
 
  }
 
  // just can't get here !
}
 
function dotable($t) {
  print "<table border=1 cellspacing=1 cellpadding=5>\n";
  for ($i = 0; $i < count($t); $i++) {
    print "  <tr>";
    for ($j = 0; $j < count($t[$i]); $j++) {
      print "    <td>".$t[$i][$j]."</td>\n";
    }
    print "  </tr>\n";
  }
  print "</table>\n";
  return;
}
 
?>
<html>
<head>
</head>
<body>
<table border=1 cellspacing=1 cellpadding=5>
<tr>
 <td><? dotable($d); ?></td>
 <? usort($d, "sort_level"); ?>
 <td><? dotable($d); ?></td>
</tr>
</table>
</body>
</html>

------------------------------------------------------------------------

[2002-05-22 14:15:55] [EMAIL PROTECTED]

<?php


/*
   let's define some array elements
   For example, 3 products (A,B,C) with different price (livre)
*/

$elt["nom"]="A"; $elt["livre"]=10;  $elt["quantite"]=1; $ar[]=$elt;
$elt["nom"]="A"; $elt["livre"]=9;   $elt["quantite"]=1; $ar[]=$elt;
$elt["nom"]="A"; $elt["livre"]=7;   $elt["quantite"]=1; $ar[]=$elt;
$elt["nom"]="A"; $elt["livre"]=11;  $elt["quantite"]=1; $ar[]=$elt;
$elt["nom"]="A"; $elt["livre"]=101; $elt["quantite"]=1; $ar[]=$elt;
$elt["nom"]="B"; $elt["livre"]=104; $elt["quantite"]=1; $ar[]=$elt;
$elt["nom"]="C"; $elt["livre"]=101; $elt["quantite"]=1; $ar[]=$elt;

/*
Our sort function only swap 2 values if the name is the same and the
first price is higher than second
As we give a 'nom' field sorted alphabetically array, we might get the
result : A7
A9
A10
A11
A101
B104
C101
Which is the result in php 4.0.6
But the result un php 4.2.1 is :
C101
B104
A7
A9
A10
A11
A101
*/

function sort_function($a, $b)
{
 if ((($a["livre"]/$a["quantite"]) == ($b["livre"]/$b["quantite"])) ||
$a["nom"] != $b["nom"]) return 0;
 return (($a["livre"]/$a["quantite"]) < ($b["livre"]/$b["quantite"])) ?
-1 : 1; }

/*
This is a 2nd function, which always returns that elements are equal.
So it might not change the array...
If you try this alternate function, you'll see that the array is
modified
to :
B104
C101
A101
A11
A9
A7
A10
??????! really strange behaviour
*/

function sort_function_void($a, $b)
{
return 0;
}

echo "<HTML><PRE>UnSorted:\n";

    for ($i=0;$i<sizeof($ar);$i++)
    echo $ar[$i]["nom"].$ar[$i]["livre"]."\n";

usort($ar, sort_function);
//usort($ar, sort_function_void);

echo "Sorted:\n";

    for ($i=0;$i<sizeof($ar);$i++)
    echo $ar[$i]["nom"].$ar[$i]["livre"]."\n";

?>

------------------------------------------------------------------------

[2002-05-22 08:45:20] [EMAIL PROTECTED]

Huh ... Related to Bug #17257

 ;)

------------------------------------------------------------------------

[2002-05-22 08:44:49] [EMAIL PROTECTED]

Related to Bug #17307

------------------------------------------------------------------------

[2002-05-18 08:49:39] [EMAIL PROTECTED]

Please prive a short self containing script (which runs right away
after copy&paste).

Derick

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/17307

-- 
Edit this bug report at http://bugs.php.net/?id=17307&edit=1

Reply via email to