Pregunta

Esto funciona:

<?php
  //compare1.php
  //**CLASS AND OBJECT
  class Entry
  {
    private $s_ids;

    public function __construct()
    {
      $this->s_ids      = array();
    }

    public function AddS_id($s_id)
    {
      $this->s_id[] = $s_id;
    }

    public function SetS_ids($s_ids)
    {
      $this->s_ids[] = $s_ids;
    }

    public function GetS_id($i)
    {
      if ($i > count($s_ids))
        throw new Exception('Out of bounds.');
      return $this->s_ids[$i];
    }

    public function GetS_ids()
    {
      return $this->s_ids;
    }
  }


  //EXTRACTION FUNCTION
  function extractS_ids($line)
  {
    $matches;
    preg_match('/^S_id:\s+(.*)\s+$/', $line, $matches);
    return $matches[1];
  }


  //LINE CHECKS
  function isStart($line)
  {
    return preg_match('/^Start.*$/', $line);
  }

  function isS_id($line)
  {
    return preg_match('/^S_id:\s+(.*)$/', $line);
  }

  function isEnd($line)
  {
    return preg_match('/^End.*$/', $line);
  }


  //VARIABLE DECLARATION
  $fName = 'sample1.txt';
  $fh    = fopen($fName, 'r');
  $line;
  $entry;
  $entrys = array();


  //PARSE OPERATION
  if ($fh === FALSE)
    die ('Failed to open file.');

  while (($line = fGets($fh)) !== FALSE)
  {
    if (isStart($line)){
      $entry = new Entry();
    }
    if (isS_id($line)){
      $entry->SetS_ids(extractS_ids($line));
    }
    if (isEnd($line)){
      $entrys[] = $entry;
    }
  }


  //ARRAY RETRIEVAL
  echo "<pre>";
    print_r($entrys);
  echo "</pre>";
  fclose($fh);

?>

Con este archivo de muestra:

Start
S_id:      0611147
S_id:      0651134
End

Start
S_id:      0611125
S_id:      0651125
End

Esto no funciona:

<?php
  //compare2.php
  //CLASS AND OBJECT
  class Entry
    {
      private $titles; 

      public function __construct()
      {
        $this->titles = array();
      }

      public function AddType($title)
      {
        $this->titles[] = $title;
      }

      public function SetTitles($titles)
      {
        $this->titles[] = $titles;
      }

      public function GetTitle($i)
      {
        if ($i > count($titles))
          throw new Exception('Out of bounds.');
        return $this->titles[$i];
      }

      public function GetTitles()
      {
        return $this->titles;
      }
    }

  //EXTRACTION FUNCTION
  function extractTitles($line)
  {
    $matches;
    preg_match('/^<title>(.*)<\/title>.*$/', $line, $matches);
    return $matches[1];
  }

  //LINE CHECK FUNCTION
  function isStart_entry($line)
  {
    return preg_match('/^<title>.*$/', $line);
  }

  function isTitle($line)
  {
    return preg_match('/^<title>.*<\/title>.*$/', $line);
  }

  function isClose_entry($line)
  {
    return preg_match('/^<\/list>.*$/', $line);
  }


  //DECLARATIONS
  $fName = 'sample2.txt';
  $fh    = fopen($fName, 'r');
  $line;
  $entry;
  $entrys = array();


  //PARSE OPERATION
  if ($fh === FALSE)
    die ('Failed to open file.');

  while (($line = fgets($fh)) !== FALSE)
  {
    if (isStart_entry($line)){
      $entry = new Entry();
    }
    if (isTitle($line)){
      $entry->SetTitles(extractTitles($line));
    }
    if (isClose_entry($line)){
      $entrys[] = $entry;
    }
  }

  // Dump the results.
  echo "<pre>";
    print_r($entrys);
  echo "</pre>";

  // Close the file.
  fclose($fh);
?>

Con este archivo de muestra:

<list>
<title>Coco</title>
<title>Cafe Milk Tea</title>
</list>
<list>
<title>Strong Off</title>
<title>5% Grapefruit</title>
</list>

La lógica parece igual. Revisé los plurales y revisé las funciones de coincidencia de preg. Todo en compare1.php parece paralelo compare2.php, pero mire las diferencias en las salidas:

Salida1:

Array
(
    [0] => Entry Object
        (
            [s_ids:Entry:private] => Array
                (
                    [0] => 0611147
                    [1] => 0651134
                )

        )

    [1] => Entry Object
        (
            [s_ids:Entry:private] => Array
                (
                    [0] => 0611125
                    [1] => 0651125
                )

        )

Salida 2:

Array
(
    [0] => Entry Object
        (
            [titles:Entry:private] => Array
                (
                    [0] => Cafe Milk Tea
                )

        )

    [1] => Entry Object
        (
            [titles:Entry:private] => Array
                (
                    [0] => 5% Grapefruit
                )

        )

)


)

¿Cómo pueden los archivos ser casi exactamente los mismos y, sin embargo, el último de los dos devuelve un tipo diferente de resultado? No debería [0] => 5% Grapefruit ser [0] => Strong off; [1] => 5% Grapefruit? Y [0] => Cafe Milk Tea ser [0] => Coco; [1] => Cafe Milk Tea?

¿Fue útil?

Solución

Su isStart_entry la función está buscando <title> en vez de <list>. Debe codificarse así:

function isStart_entry($line)
{
  return preg_match('/^<list>.*$/', $line);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top