Bubble sort su campo provoca replicazione di id

Ciao Gianni, sto utilizzando il bubble sort per ordinare un vettore di pochi oggetti:

while ($j > 0) {
             for ($i = 0; $i < $j; $i++) {
              if (!isset($this->prices[$i], $this->prices[$j])) {
                  continue;
               }
                if ($this->prices[$i]->get('season') > $this->prices[$i+1]->get('season')) {
                  $temp = $this->prices[$i];
                  $this->prices[$i] = $this->prices[$i+1];
                  $this->prices[$j] = $temp;
               }
            }
            $j--;
         }

solo che ordinandoli in base ad uno dei campi, in questo caso season, tutti gli elementi scambiati hanno lo stesso ID ed alla fine mi ritrovo con tutti gli elementi che son stati scambiati con lo stesso ID.

Qualche soluzione?

 :bye:

inviato 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

non mi è chiaro a cosa ti riferisci quando parli di ID

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Dunque, il problema è risolto, ho usato ORDER BY id ASC per averli in ordine crescente senza usare un algoritmo di ordinamento.

Il problema rimane comunque per il bubble sort, ti illustro in breve la situazione:

class Price
   -id: Int
   -season: Int
   -status: Bool
   -label: String
   -type: Int

   +get($var: String)
   +set($var: String, $val: String)

Questa è la struttura della classe Price.

Il codice per l'ordinamento è questo:

<?php
// [...]
while ($j > 0) {
             for ($i = 0; $i < $j; $i++) {
              if (!isset($this->prices[$i], $this->prices[$j])) {
                  continue;
               }
                if ($this->prices[$i]->get('season') > $this->prices[$i+1]->get('season')) {
                  $temp = $this->prices[$i];
                  $this->prices[$i] = $this->prices[$i+1];
                  $this->prices[$j] = $temp;
               }
            }
            $j--;
         }
// [...]

Il risultato dell'ordinamento fatto da quel codice è una lista ordinata in modo crescente in base al campo season ma gli attributi degli elementi della lista scambiati risultano duplicati.

Eg.

Codice per la prova dell'errore:

<?php
error_reporting(~E_NOTICE);
class Price
{
   var $values = Array(
      'id'     => null,
      'type'   => null,
      'label'  => null,
      'season' => null,
      'status' => null
   );
   
   function Price($values)
   {
      foreach ($values as $var => $val) {
         $this->values[$var] = $val;
      }
   }
   
   function get($var) 
   {
      if (null !== $this->values[$var]) {
         return $this->values[$var];
      }
      return false;
   }
   
   function set($var, $val)
   {
      if (null == $this->values[$var]) {
         $this->values[$var] = $val;
         return;
      }
      return false;      
   }
   
   function toString()
   {
      $out = '';
      foreach ($this->values as $var => $val) {
         $out .= '<li>' . $var . ': ' . $val . ';' . '</li>';
      }
      return '<ul>' . $out . '</ul>';
   }
}


$array = Array();
for ($i = 0; $i < 5; $i++) {
   $values = Array('id' => $i, 'type' => rand(0, 1), 'label' => 'Prova_' . $i, 'season' => rand(0, 3), 'status' =>rand(0, 1));
   $array[$i] = new Price($values);
   sleep(.6);
}
echo 'Unordered' . '<ul>';
foreach ($array as $element) {
   echo '<li>' . $element->get('id') . $element->toString() . '</li>';
}
echo '</ul>';
$j = sizeof($array);
while ($j > 0) {
   for ($i = 0; $i < $j; $i++) {
      if (!isset($array[$i], $array[$j])) {
         continue;
      }
      if ($array[$i]->get('season') > $array[$i+1]->get('season')) {
         $temp = $array[$i];
         $array[$i] = $array[$i+1];
         $array[$j] = $temp;
      }
   }
   $j--;
}
echo 'Ordered' . '<ul>';
foreach ($array as $element) {
   echo '<li>' . $element->get('id') . $element->toString() . '</li>';
}
echo '</ul>';

I valori serializzati che riproducono l'errore sono qui sotto, puoi usarli per valorizzare $array o fare le prove con i valori generati a caso ad ogni esecuzione.

a:5:{i:0;O:5:"Price":1:{s:6:"values";a:5:{s:2:"id";i:0;s:4:"type";i:1;s:5:"label";s:7:"Prova_0";s:6:"season";i:0;s:6:"status";i:1;}}i:1;O:5:"Price":1:{s:6:"values";a:5:{s:2:"id";i:2;s:4:"type";i:1;s:5:"label";s:7:"Prova_2";s:6:"season";i:0;s:6:"status";i:0;}}i:2;r:9;i:3;O:5:"Price":1:{s:6:"values";a:5:{s:2:"id";i:3;s:4:"type";i:1;s:5:"label";s:7:"Prova_3";s:6:"season";i:3;s:6:"status";i:0;}}i:4;O:5:"Price":1:{s:6:"values";a:5:{s:2:"id";i:1;s:4:"type";i:1;s:5:"label";s:7:"Prova_1";s:6:"season";i:3;s:6:"status";i:0;}}}

Credo di aver detto tutto quello che era necessario ^^', ora mi servirebbe un aiutino a trovare la causa di questo problema ;D

non mi è chiaro a cosa ti riferisci quando parli di ID

Già mi ero scordato di dire che sono oggetti persistenti, e quindi sono caricati dal database ^^', in realtà la classe Price estende una classe che mi permette di manipolare l'oggetto come se fosse il record di una tabella.

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
modificato 8 anni fa
X 0 X

E' tutta colpa di una piccola distrazione nell'algoritmo:

$j = count($array) - 1;
while ($j > 0) {
   for ($i = 0; $i < $j; $i++) {
      if ($array[$i]->get('season') > $array[$i+1]->get('season')) {
         $temp = $array[$i];
         $array[$i] = $array[$i+1];
         $array[$i+1] = $temp;
      }
   }
   $j--;
}

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda