遍历数组的强大方法

时间:2011-11-17 23:21:26

标签: php arrays

我有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亿多个条目。

5 个答案:

答案 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_encodejson_decode

这有点类似,但你需要更快地衡量自己:

$array = (array) $xml;
array_walk_recursive($array, function(&$v) { $v = (array) $v; });
祝你好运!

无论如何,我想知道那个XML字符串有多大。嗯。我认为你提供的数字不正确,你的问题在第二个想法上看起来很虚伪。