PHP自定义排序preg_match_all?

时间:2014-03-13 20:14:18

标签: php regex

所以我知道那里有关于自定义订购的文章,但我认为我的情况可能有点不同(或者可能只是我的解决方法很糟糕:P)。这是快速方案。

我从我们拥有的报告网址中提取XML数据。 (格式不正确!)所以让我们使用下面的例子:我在一个长列表中得到以下数据。

<Site>My Sites</Site>
<Customer>PHPSTEVE</Customer>
<Name>Griswald</Name>
<Site> Evil Dead</Site>
<Customer>Bruce</Customer>
<Name>Campbell</Name>

我无法使用XML函数,因为格式标题不正确所以我不会进入那个......所以我使用了preg_match_all

preg_match_all("/<Site>(.*?)<\/Site>|<Customer>(.*?)<\/Customer>|<Name>(.*?)<\/Name>/is", $resp, $output_array[]);

然后我经历了,我知道这不好但是有效..

foreach(array_reverse($output_array[0][0]) as $info){

    $myinfo = $info . $myinfo;

}

一切正常,因为我使用str_replace并且只是放入我的表格标签等。显然我正在反向阅读...它确实我想要这样做。

Site      | Customer | Name
----------+----------+------
Evil Dead | Bruce    | Campbell

如果我想要&#34;客户&#34;现场第一?所以基本上我改变了网站和客户等的水平顺序......请记住,一行中有多条记录,所以我想弄清楚如何将客户移动到我想要的位置......或者任何字段对于这个问题。根据我上面的代码,我不相信我能按照我想要的方式完成它,所以我不确定是否有其他方法可以做到。

我想以此报告:

Customer | Site      | Name
---------+-----------+------
Bruce    | Evil Dead | Campbell

任何帮助将不胜感激。注意:我不在乎自下而上或自上而下阅读..只是字段更改。感谢

更新:我遇到的XMl问题是:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<results>
<Site>My Sites</Site>
<Customer>PHPSTEVE</Customer>
<Name>Griswald</Name>
<Site> Evil Dead</Site>
<Customer>Bruce</Customer>
<Name>Campbell</Name>
</results>

1 个答案:

答案 0 :(得分:0)

也许是这样的?

function sortCustomerKeys($a, $b)
{
    if ( $a == 'Customer' && $b != 'Customer' ) {
        return 1;
    } else if ( $a != 'Customer' && $b == 'Customer' ) {
        return -1;
    }
    return strnatcasecmp($a, $b);
}

$customers = array();
$advance = array(
    'Customer'    => 0,
    'Name'        => 0,
    'Site'        => 0
);

if ( preg_match_all('@<(Customer|Name|Site)>\\s*(.*?)\\s*</\\1>@is', $resp, $m) ) {

    for ($i = 0, $j = 0; $i < count($m[1]); $i++) {

        $tag = $m[1][$i];
        $value = $m[2][$i];
        $customers[$j][$tag] = $value;

        $advance[$tag] = 1;
        if ( array_sum($advance) == count($advance) ) {
            $advance = array(
                'Customer'    => 0,
                'Name'        => 0,
                'Site'        => 0
            );
            uksort($customers[$j], 'sortCustomerKeys');
            $j++;
        }

    }

}

var_dump($customers);