PHP和XML-在文档中设置唯一的ID


PHP and XML - Set unique ids in document

我有这个脚本示例:

while (count($xml->xpath('*[@id="' . $id . '"]/@id')) > 0)
{
    $id = 'example_' . ++$x;
}

但如果我在元素中使用1.000 Childrens进行检查,我必须等待一个多小时才能得到响应。

如何更快地检查是否存在id?

提前感谢您的小费

通过获取最高id并添加1来获得唯一id。
由于您没有提供XML,我假设我的示例如下:

<elements>
    <element id="example_1" />
    <element id="example_5" />
    <element id="example_27" />
</elements>

这是代码(内联函数的PHP>=5.3):

$xml = simplexml_load_string($x); // assume XML in $x
$ids = $xml->xpath("//element/@id");
$newid = max(array_map(
    function($a) {
        list(, $id) = explode("_", $a);
        return intval($id); }
    , $ids)) + 1;
$newid = "example_$newid";
echo $newid;

输出:

example_28

看到它工作:http://codepad.viper-7.com/SFvf7v

评论:
1.第2行中的xpath表达式构建XML中所有id的数组$ids
2.为了执行max(),我们需要将example_处的数字分离,并将数字更改为int,这是通过array_map()调用内联函数来完成的
3.在这个函数中,我们使用list()来获取用explode()分隔的字符串的数字部分,并将其返回为int

感谢@michi:

我修改了这个例子,这是最后的答案:

$ids = $xml->xpath('*[@id="' . $id . '"]/@id');
if(count($ids) > 0)
{
    $ids = $xml->xpath('*[starts-with(@id, "example_")]/@id');
    $id = max(array_map(
            function($a)
            {
                list(, $id) = explode('_', $a);
                return intval($id);
            }, $ids)) + 1;
    $id = 'example_' . $id;
}

=}