Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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自定义排序预匹配?_Php_Regex - Fatal编程技术网

PHP自定义排序预匹配?

PHP自定义排序预匹配?,php,regex,Php,Regex,所以我知道有关于定制订购的文章,但我认为我的情况可能有点不同(或者可能只是我的解决方法很糟糕:p)。下面是一个快速的场景 我从已有的报告url中提取XML数据。(未正确格式化!)因此,让我们使用以下示例:我在一个长列表中返回以下数据 <Site>My Sites</Site> <Customer>PHPSTEVE</Customer> <Name>Griswald</Name> <Site> Evil Dead&

所以我知道有关于定制订购的文章,但我认为我的情况可能有点不同(或者可能只是我的解决方法很糟糕:p)。下面是一个快速的场景

我从已有的报告url中提取XML数据。(未正确格式化!)因此,让我们使用以下示例:我在一个长列表中返回以下数据

<Site>My Sites</Site>
<Customer>PHPSTEVE</Customer>
<Name>Griswald</Name>
<Site> Evil Dead</Site>
<Customer>Bruce</Customer>
<Name>Campbell</Name>
当我使用str_替换并放入我的表标签等时,一切正常。。很明显,我在做相反的阅读。。没关系,我希望这样

Site      | Customer | Name
----------+----------+------
Evil Dead | Bruce    | Campbell
如果我先要“客户”字段怎么办?所以基本上我在改变网站和客户的水平顺序等等。。。请记住,一行中有多条记录,所以我正试图找出如何将客户转移到我想要的地方。。或者任何领域。基于我上面的代码,我不相信我能以我想要的方式完成它,所以我不确定是否有其他方法可以完成它

我想报告如下:

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>

此XML文件似乎没有任何与之关联的样式信息。文档树如下所示。
我的网站
普斯提夫
格里斯瓦尔德
邪恶的死者
布鲁斯
坎贝尔

也许是这样的

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);
函数排序客户密钥($a,$b)
{
如果($a=='Customer'&&b!='Customer'){
返回1;
}如果($a!='Customer'和&$b=='Customer'){
返回-1;
}
返回strnatcasecmp($a,$b);
}
$customers=array();
$advance=数组(
“客户”=>0,
“名称”=>0,
“站点”=>0
);
if(preg_match_all('@\\s*(.*?\\s*@is',$resp,$m)){
对于($i=0,$j=0;$i0,
“名称”=>0,
“站点”=>0
);
uksort($customers[$j],'sortCustomerKeys');
$j++;
}
}
}
var_dump(客户);

能否提供不正确的格式标题?请使用
PREG\u SET\u ORDER
和命名匹配组。您当前正在连接匹配项,包括xml标记;似乎不可能以任何有意义的方式对其进行正确的重新排序。此XML文件似乎没有任何与之关联的样式信息。文档树如下所示。这就是我得到的错误。。我尝试过PREG_SET_顺序,但似乎它首先带来了一个标记的所有实例,最后带来了其余的数据。所以我会得到所有客户的。。然后,剩下的部分不会遍历每个集合,并提供“CUSTOMER”作为第一个字段,然后是名称等。您对XML生成没有控制权吗?如果是这样的话,您应该首先解决这个问题,以获得适当的层次结构分组,如
…..
谢谢。。我试试看。我知道我的方法基本上限制了使用任何ksort或usort。我很感谢你的意见,我会让你知道我是怎么做的。还有一个问题。。所以,如果我想更改客户、名称和站点。如果我有另一份报告,我只想把客户移到最后。。那么名称>>站点>>客户,我到底要做什么更改来移动该订单?除此之外,它似乎做了我需要它做的事情。谢谢您必须使用自定义排序函数,而不仅仅是默认的ksort()。我会更新我的答案,包括一个。好的,我在考虑uksort。。我看了一些例子,但它们并没有按照我的预期排序。我很感谢你的更新,这就成功了。我通常不会处理更复杂(对我来说更复杂)的数组,所以我感谢您的耐心。
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>
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);