Gérer des listes avec tstringlist [poo]

Description

Gestion de panier: ajouter, insérer, déplacer, supprimer, trier, repérer, vider, enregistrer dans un fichier, afficher dans le navigateur...

C'est une classe PHP opérationnelle, testée et retestée (!) qui reprend les lignes essentielles de la classe TStringList disponible en langage Delphi (cf classes.pas).

Le fonctionnement de la classe est simple : tous les items sont juxtaposés dans une chaîne de caractères et séparés par le caractère #0 de la table ASCII (non disponible sur le clavier).
ATTENTION: si vous ajoutez un item comportant ce caractère, toute la liste sera faussée. Le caractère est paramétrable via la variable $FSep.

En principe, avec cette classe, on peut gérer facilement des paniers sachant que la classe a des relations E/S permettant des enregistrements et des restaurations faciles depuis les fichiers.

Testé sur:
Apache 1.3.27
PHP 4.3.3
Windows

Source / Exemple :


<?php
  class TStringList {

//==================================== VARIABLES INTERNES
    /*private*/ var $FSep = '';
    /*private*/ var $FContent = '';

//==================================== UTILITAIRES
    /*private*/ function CountCharInStr($Char, $String) {
      $Cnt = 0;
      for ($x=0 ; $x<strlen($String) ; $x++)
        if ($String[$x] == $Char)
          $Cnt++;
      return $Cnt;
    }

    /*private*/ function IL_CheckError($Index) {
      return ($Index<0) || ($Index>=$this->Count());
    }

    /*private*/ function Min($I1, $I2) {
      if ($I1<$I2)
        return $I1;
      else
        return $I2;
    }

    /*private*/ function AnsiCompareString($S1, $S2) {
      for ($idx=0 ; $idx < $this->Min(strlen($S1),strlen($S2)) ; $idx++)
        if (Ord($S1[$idx]) < Ord($S2[$idx]))
          return true;
        else
          return false;
    }

//==================================== CORPS GENERAL
    /*public*/ function ResetList() {
      $this->FSep = chr(0);
      $this->FContent = '';
    }

    /*public*/ function Count() {
      return $this->CountCharInStr($this->FSep, $this->FContent);
    }

    /*public*/ function Add($Value) {
      $this->FContent .= $Value . $this->FSep;
    }

    /*public*/ function Delete($Index) {
      if ($this->IL_CheckError($Index))
        Exit;
      $Rsl = '';
      for ($x=0 ; $x<=$this->Count() - 1 ; $x++)
        if ($x != $Index)
          $Rsl .= $this->GetItem($x) . $this->FSep;
      $this->FContent = $Rsl;
    }

    /*public*/ function Insert($Index, $Value) {
      $Rsl = '';
      for ($x=0 ; $x<$this->Count() ; $x++) {
        if ($x == $Index)
          $Rsl .= $Value . $this->FSep;
        $Rsl .= $this->GetItem($x) . $this->FSep;
      }
      if ($Index == $this->Count())
        $Rsl .= $Value . $this->FSep;
      $this->FContent = $Rsl;
    }

    /*public*/ function Move($CurIndex, $NewIndex) {
      $Rsl = $this->GetItem($CurIndex);
      $this->Delete($CurIndex);
      if ($NewIndex > $CurIndex)
        $NewIndex--;
      $this->Insert($NewIndex,$Rsl);
    }

    /*public*/ function GetItem($Index) {
      $Rsl = '';
      $Last = 0;
      $Cnt = 0;
      if ($this->IL_CheckError($Index))
        Exit;
      for ($x=0 ; $x<strlen($this->FContent) ; $x++)
        if ($this->FContent[$x] == $this->FSep) {
          if ($Index == $Cnt) {
            $Rsl = substr($this->FContent, $Last, $x-$Last);
            break;
          }
          $Cnt++;
          $Last = $x+1;
        }
      return $Rsl;
    }

    /*public*/ function SetItem($Index, $Value) {
      if ($Index > $this->Count()-1)
        $this->Add($Value);
      else {
        if ($this->IL_CheckError($Index))
          Exit;
        $Rsl = '';
        for ($x=0 ; $x<=$this->Count()-1 ; $x++) 
          if ($x == $Index)
            $Rsl .= $Value . $this->FSep;
          else
            $Rsl .= $this->GetItem($x) . $this->FSep;
        $this->FContent = $Rsl;
      }
    }

    /*public*/ function Clear () {
      $this->FContent = '';
    }

      /*private*/ function SortEx($SortMode) {
        for ($i=1 ; $i<$this->Count() ; $i++) {
          $Locked = false;
          for ($n=0 ; $n<$i ; $n++) {
            if (($this->AnsiCompareString($this->GetItem($i), $this->GetItem($n))==$SortMode) && !$Locked) {
              $this->Move($i,$n);
              $Locked = true;
            }
          }
        }
      }

    /*public*/ function Sort() {
      $this->SortEx(true);
    }

    /*public*/ function RevSort() {
      $this->SortEx(false);
    }

    /*public*/ function IndexOf($Value) {
      $Position = -1;
      for ($x=0 ; $x<$this->Count() ; $x++)
        if ($this->GetItem($x)==$Value) {
          $Position=$x;
          break;
        }
      return $Position;
    }

    /*public*/ function AddToFile($FileName) {
      $fichier = fopen($FileName, 'a+');
      fputs($fichier, $this->FContent);
      fclose($fichier);
    }

    /*public*/ function LoadFromString($Value) {
      $this->FContent = $Value;
    }

    /*public*/ function LoadFromFile($FileName) {
      $fichier = fopen($FileName, 'r');
      $this->FContent = fread($fichier, filesize($FileName));
      fclose($fichier);
    }

    /*public*/ function Display() {
      echo str_replace($this->FSep, '<br>', $this->FContent);
    }

  } //fin CLASS
?>

Conclusion :


Vous pouvez toujours allez voir http://altert.family.free.fr/

IMPORTANT: le Zip propose un script de démonstration.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.