我有XML文件中的数据,即
<domain>
<host>xyz</host>
<key>keeeeeeeeeey</key>
</domain>
<domain>
<host>xyz</host>
<key>keeeeeeeeeey</key>
</domain>
从那个xml我创建了一个健壮的数组我已经知道如何找到使用xml我会这样做但是我缺乏知识我使用以下方法将xml文件转换为数组:
$json = json_encode($xml);
$array = json_decode($json,TRUE);`
下面是我的数组:
Array
(
[domain] => Array
(
[0] => Array
(
[host] => bdbdfbdvbdbdfbdfbf.net
[key] => 933f416350de1a955544b30b5bb7ca09cfa2311101a22972320cc4c7af2ecedc03f36b8a48961ef938972478592a1e261819052b51c09a45cf805663f83cb2c0233969255a2c3e2e7e212a295a247b785d41
)
[1] => Array
(
[host] => bdev1vvvvvvveinf.net
[key] => 933f416350de1a955544b30b5bb7ca09cfa2311101a22972320cc4c7af2ecedc03f36b8a48961ef938972478592a1e261819052b51c09a45cf805663f83cb2c0233969255a2c3e2e7e212a295a247b785d41
)
[2] => Array
(
[host] => bdev1.aaaaaaaaureinf.net
[key] => 933f416350de1a955544b30b5bb7ca09cfa2311101a22972320cc4c7af2ecedc03f36b8a48961ef938972478592a1e261819052b51c09a45cf805663f83cb2c0233969255a2c3e2e7e212a295a247b785d41
)
[3] => Array
(
[host] => bdennnnnnnninf.net
[key] => 933f416350de1a955544b30b5bb7ca09cfa2311101a22972320cc4c7af2ecedc03f36b8a48961ef938972478592a1e261819052b51c09a45cf805663f83cb2c0233969255a2c3e2e7e212a295a247b785d41
)
[4] => Array
(
[host] => bdeveewerwerwerwerreinf.net
[key] => 933f416350de1a955544b30b5bb7ca09cfa2311101a22972320cc4c7af2ecedc03f36b8a48961ef938972478592a1e261819052b51c09a45cf805663f83cb2c0233969255a2c3e2e7e212a295a247b785d41
)
)
)
我想要一个健壮的循环,如果我传递主机名,它将返回密钥。任何人都可以请一些光吗?阵列的大小可以增加到1亿多个条目。
答案 0 :(得分:5)
将数组更改为:
$data = array('domain' => array(
'bdbdfbdvbdbdfbdfbf.net' => '933...',
'bdev1vvvvvvveinf.net' => '933...',
));
然后你可以这样做:
echo $data['domain']['bdbdfbdvbdbdfbdfbf.net'];
使用当前阵列没有“强大”的方法。你必须搜索整个事情:
function get_key($data, $host)
{
foreach ($data['domain'] as $domain)
{
if ($domain['host'] == $host)
return $domain['key'];
}
}
鉴于这一新信息:
阵列的大小可能增加到1亿多个条目。
我撤回了这个答案的用处,因为使用任何纯文本格式(包括XML或序列化的PHP键值数组)来存储这些数据的整个概念都是疯狂的。
您应该将数据存储在索引域的数据库中。即使是sqlite数据库也是对文本文件的线性探测的重大升级。
当然,有一些方法可以将数据存储为优化的自定义格式,但实际上没有理由重新发明数据库可以轻松完成的任务。
答案 1 :(得分:2)
如果可能的话,我认为如果主机可以代替数组键而不是数字索引会更好。这意味着它可能看起来像
Array
(
[domain] => Array
(
[bdbdfbdvbdbdfbdfbf.net] => Array
(
[key] => 933f416350de1a955544b30b5bb7ca09cfa2311101a22972320cc4c7af2ecedc03f36b8a48961ef938972478592a1e261819052b51c09a45cf805663f83cb2c0233969255a2c3e2e7e212a295a247b785d41
)
[bdev1vvvvvvveinf.net] => Array
(
[key] => 933f416350de1a955544b30b5bb7ca09cfa2311101a22972320cc4c7af2ecedc03f36b8a48961ef938972478592a1e261819052b51c09a45cf805663f83cb2c0233969255a2c3e2e7e212a295a247b785d41
)
[bdev1.aaaaaaaaureinf.net] => Array
(
[key] => 933f416350de1a955544b30b5bb7ca09cfa2311101a22972320cc4c7af2ecedc03f36b8a48961ef938972478592a1e261819052b51c09a45cf805663f83cb2c0233969255a2c3e2e7e212a295a247b785d41
)
)
)
可以搜索
$somedomain = "bdev1.aaaaaaaaureinf.net";
if (isset($domains['domain'][$somedomain])) {
// do stuff
//$domains['domain'][$somedomain]['key']; is the key you want
}
如果可以,那就这样做
答案 2 :(得分:1)
由于你只需要外部数组中的[domain]数组,所以这应该可行
function getKey($domains)
{
foreach($domains as $domain)
{
if($domain['host'] == $testHost)
return $domain['key'];
}
return false;
}
$myKey = getKey($myArr['domain']);
答案 3 :(得分:1)
这是一个适用于您提供的数组的方法。您不必对阵列进行任何更改。
/**
* Find the Key of the Domain in the Array with a Given Host
* @param $given The host you want to search for
* @returns The key of the domain (of the array) that has the matching host
*/
function findHost($given)
{
// This code assumes that the data array is $array .
global $array;
foreach ($array["domain"] as $key => $value)
{
if ($value["host"] == $given)
return $key;
}
// If no matches
return false;
}
// Call findHost() as you desire.
// If there is no match, the function returns false.
// Otherwise, it returns the key of $array["domain"] that the host matches.
答案 4 :(得分:0)
有了100 000 000多个条目,你可能会达到PHP中的字符串长度限制,这意味着你不能再使用json_encode
和json_decode
。
这有点类似,但你需要更快地衡量自己:
$array = (array) $xml;
array_walk_recursive($array, function(&$v) { $v = (array) $v; });
祝你好运!
无论如何,我想知道那个XML字符串有多大。嗯。我认为你提供的数字不正确,你的问题在第二个想法上看起来很虚伪。