Php 如何基于一个参数将XML文件拆分为三个新数组?
我创建了一个PHP类,当您输入经度和纬度时,它会查找并返回附近学校的XML列表。我将它们输出到三个HTML表中,一个用于小学、中学和高中。XML源文件不包含这些信息,只包含学校提供的分数范围,因此我使用正则表达式对它们进行排序,如下所示:Php 如何基于一个参数将XML文件拆分为三个新数组?,php,arrays,xml,wordpress,Php,Arrays,Xml,Wordpress,我创建了一个PHP类,当您输入经度和纬度时,它会查找并返回附近学校的XML列表。我将它们输出到三个HTML表中,一个用于小学、中学和高中。XML源文件不包含这些信息,只包含学校提供的分数范围,因此我使用正则表达式对它们进行排序,如下所示: foreach($data as $school) { if (preg_match("/1[0-2]$/", $school->gradeRange)) {?> <tr><td><?=$s
foreach($data as $school) {
if (preg_match("/1[0-2]$/", $school->gradeRange)) {?>
<tr><td><?=$school->name?></td>
<td><address><?=$school->address?>, <?=$school->city?></address></td>
但它实际上并没有对数据本身做任何工作。有没有办法让这个函数将gradeRange节点与表达式匹配的学校拆分为它们自己的数组,这样我就可以为每个学校级别创建一个单独的数组?我已经在这里和谷歌上搜索了所有我认为可以搜索的东西,结果我空手而归
如果这是一个愚蠢的问题,我道歉,我只做了大约一个星期。我在这里做了一些很快的事情,这实际上不是很漂亮,但可能会有所帮助
<?php
class School {
public $gradeRange;
public $name;
public $address;
public $city;
public $high;
public function __construct($gradeRange, $name, $address, $city) {
$this->gradeRange = $gradeRange;
$this->name = $name;
$this->adress = $address;
$this->city = $city;
}
}
$data = array(
new School(112, "springfield hs", "99 strt", "Springfield"),
new School(111, "stuff hs", "blvd stuff", "stufftown"),
new School(134, "univerisity (not an highschool)", "here", "charlestown"),
new School(110, "paul", "23 rd", "poll"),
);
foreach ($data as $school) {
if (preg_match("/1[0-2]$/", $school->gradeRange)) { ?>
<tr>
<td><?= $school->name ?></td>
<td>
<address><?= $school->address ?>, <?= $school->city ?></address>
</td>
</tr>
<?php }
}
class SchoolSorter
{
public $schools;
/**
* @param array|School $schools
*/
public function __construct(array $schools)
{
//$xmlReadre = new XMLReader();
//$xmlReadre->readString($xml);
$this->schools = $schools;
}
public function sortSchools()
{
foreach ($this->schools as $school) {
if (preg_match("/1[0-2]$/", $school->gradeRange)) {
$school->high = "true";
}
}
}
}
$that_scholl_sorter = new SchoolSorter(
$data
);
echo "before: \n";
var_dump($that_scholl_sorter->schools);
$that_scholl_sorter->sortSchools();
echo "after: \n";
var_dump($that_scholl_sorter->schools);
有用
请注意,您也可以通过参考通过学校,请参见,但不建议这样做,请参见。查看问题中的第一个代码示例:
foreach ($data as $school) {
if (preg_match("/1[0-2]$/", $school->gradeRange)) {?>
<tr><td><?=$school->name?></td>
<td><address><?=$school->address?>, <?=$school->city?></address></td>
这本身(假设您实例化了一个SimpleXMLIterator而不是一个SimpleXMLIterator,它应该可以在没有问题的情况下工作)允许您将过滤条件移出foreach
:
$highSchools = new HighSchools($data);
foreach ($highSchools as $school) {
echo $school->name, "\n";
}
由于您可能没有单个筛选器,因此可以创建一系列筛选器类,以便更容易编写多个筛选器并减少重复代码:
abstract class SchoolFilter extends FilterIterator
{
final public function accept()
{
$school = $this->getInnerIterator()->current();
return $this->acceptSchool($school);
}
}
class HighSchools extends SchoolFilter
{
public function acceptSchool($school)
{
return preg_match("/1[0-2]$/", $school->gradeRange);
}
}
然后你可以在学校的课堂上继续。甚至可以从SimpleXMLIterator扩展,并制作一个特殊的函数,它能够为自己过滤的集合提供访问器方法
另一种选择是,您已经在XML中取消了学校的分类/类型化,这样您也可以使用xpath轻松地查询文档
我希望这能提供一些途径,让我们朝着更模块化的设计方向前进,这样您就更容易找到放置过滤条件的地方,并使它们可以互换
因为这里不需要三个数组。您只是希望以不同的方式显示三次相同的数据。数据只存在一次,而不是三次。保持它的简单性,然后您就可以用一千种不同的方式来显示数据,只需对代码进行少量修改
class HighSchools extends FilterIterator
{
public function accept()
{
$school = $this->getInnerIterator()->current();
return preg_match("/1[0-2]$/", $school->gradeRange);
}
}
$highSchools = new HighSchools($data);
foreach ($highSchools as $school) {
echo $school->name, "\n";
}
abstract class SchoolFilter extends FilterIterator
{
final public function accept()
{
$school = $this->getInnerIterator()->current();
return $this->acceptSchool($school);
}
}
class HighSchools extends SchoolFilter
{
public function acceptSchool($school)
{
return preg_match("/1[0-2]$/", $school->gradeRange);
}
}