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