Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何基于一个参数将XML文件拆分为三个新数组?_Php_Arrays_Xml_Wordpress - Fatal编程技术网

Php 如何基于一个参数将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

我创建了一个PHP类,当您输入经度和纬度时,它会查找并返回附近学校的XML列表。我将它们输出到三个HTML表中,一个用于小学、中学和高中。XML源文件不包含这些信息,只包含学校提供的分数范围,因此我使用正则表达式对它们进行排序,如下所示:

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