Question

This works:

<?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);

?>

With this sample file:

Start
S_id:      0611147
S_id:      0651134
End

Start
S_id:      0611125
S_id:      0651125
End

This does not work:

<?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);
?>

With this sample file:

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

The logic seems the same. I checked the plurals, and I checked the preg match functions. Everything in compare1.php seems to parallel compare2.php, but look at the differences in the outputs:

Output1:

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
                )

        )

Output 2:

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

        )

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

        )

)


)

How can the files be pretty much exactly the same, and yet the latter of the two returns a different kind of result? Shouldn't [0] => 5% Grapefruit be [0] => Strong off; [1] => 5% Grapefruit? And [0] => Cafe Milk Tea be [0] => Coco; [1] => Cafe Milk Tea?

Was it helpful?

Solution

Your isStart_entry function is looking for <title> instead of <list>. It should be coded like this:

function isStart_entry($line)
{
  return preg_match('/^<list>.*$/', $line);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top