私はこのスクリプトの例を持っています:
while (count($xml->xpath('*[@id="' . $id . '"]/@id')) > 0)
{
$id = 'example_' . ++$x;
}
しかし、要素内の 1.000 の子でこれを確認すると、応答を 1 時間以上待たなければなりません。
ID が存在するかどうかをすばやく確認するにはどうすればよいですか?
ヒントをお寄せいただきありがとうございます。
私はこのスクリプトの例を持っています:
while (count($xml->xpath('*[@id="' . $id . '"]/@id')) > 0)
{
$id = 'example_' . ++$x;
}
しかし、要素内の 1.000 の子でこれを確認すると、応答を 1 時間以上待たなければなりません。
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
ありがとう @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;
}
=}