我有这个脚本示例:
while (count($xml->xpath('*[@id="' . $id . '"]/@id')) > 0)
{
$id = 'example_' . ++$x;
}
但是,如果我在元素中使用 1.000 个儿童进行检查,我必须等待一个多小时才能得到回复。
我怎样才能更快地检查一个 id 是否存在?
提前感谢您的提示!
我有这个脚本示例:
while (count($xml->xpath('*[@id="' . $id . '"]/@id')) > 0)
{
$id = 'example_' . ++$x;
}
但是,如果我在元素中使用 1.000 个儿童进行检查,我必须等待一个多小时才能得到回复。
我怎样才能更快地检查一个 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 行中的表达式在XML 中构建了一个包含所有 idxpath
的数组
2. 我们需要将 与处的数字分开并将数字更改为,这是通过调用内联函数来完成的
3。在这个函数中,我们用来抓取字符串中分隔的数字部分并将其返回为$ids
example
_
int
max()
array_map()
list()
explode()
int
Thanks @michi:
I modified the example and this is the final answer:
$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;
}
=}