0

我有这个数组

$array = array(
    "one" => "bar",
    "two"    => "21",
    "three"    => "22",
    "four"    => "25",
    "five" => array(
         "xxxxxxxxxxxxxxxxxx" => array(
             "ar1" => "food",
             "ar2" => "dr",
             "ar3" => "ch",
             "ar4" => "ju"
         ),
        "yyyyyyyyyyyyyyyyyyyy" => array(
             "ar1" => "food",
             "ar2" => "dr",
             "ar3" => "ch",
             "ar4" => "ju"
         )),
    "six" => "et",
    "seven" => "op",
    "eight" => "hjs",
    "nine" => array(
         "1" => array(
             "ar5" => "food",
             "ar87" => "dr",
             "ar21" => "ch",
             "ar443" => "ju"
         ),
         "2" => array(
             "73" => "food",
             "82" => "dr",
             "90" => "ch",
             "2123" => "ju"
         )),
    "ten" => "bar",
    "eleven" => "bar",
    "twelve" => "bar"
);

我想确保添加的每个新数组都必须有一个唯一的数组键。为此,我首先获取其他人的所有键,即$array['nine']在我的情况下,然后运行一个函数,直到找到一个唯一键。

添加一个新数组$array['nine']并获取所有键nine

$keyedd = array_keys($array['nine']);

$appendThis[''.unique_array_key($keyedd).''] = array(
             "73" => "nitrous",
             "82" => "oxide",
             "90" => "laughing",
             "2123" => "gas"
             );

$array['nine'] =  $array['nine'] + $appendThis;

这是功能

function unique_array_key($the_array){
$r = rand();
if (array_key_exists("$r", $the_array)) {
    unique_array_key($the_array);
}
else if(!array_key_exists("$r", $the_array)) {
    echo $r;
}
}

一旦我运行这个

[nine] => Array
        (
            [1] => Array
                (
                    [ar5] => food
                    [ar87] => dr
                    [ar21] => ch
                    [ar443] => ju
                )

            [2] => Array
                (
                    [73] => food
                    [82] => dr
                    [90] => ch
                    [2123] => ju
                )

            [] => Array
                (
                    [73] => nitrous
                    [82] => oxide
                    [90] => laughing
                    [2123] => gas
                )

        )

新添加的数组没有数组键。但是,unique_array_key($keyedd);它本身似乎工作正常。为什么函数没有添加唯一键?

4

2 回答 2

2

我更喜欢内部 PHP 功能来生成唯一密钥:

$appendThis[uniqid()] = array(
    "73"   => "nitrous",
    "82"   => "oxide",
    "90"   => "laughing",
    "2123" => "gas"
);

无需重新发明轮子。检查uniqid()函数的文档。

更新
如果您的 web-cluster 在多个具有共享数据存储的主机上同时运行您的应用程序,并且在一秒钟内生成超过 10000 个 ID,只需使用:

uniqid(php_uname('n'), true)

用于 ID 生成。您的rand()ID 生成解决方案只有mt_getrandmax()变化。通常是 2147483647。在 10000 秒内生成 10000 个 ID,您将在2.4 天内超过可用 ID 的限制,并且您的代码将无限循环运行,因为数组中的每个键检查都会有真实的结果,并一次又一次地递归调用新的 ID 生成.

此外,您的解决方案使应用程序性能取决于数据量。由于重复,您将拥有更多的数据,而不是更多的 ID 生成循环的机会。例如,如果您有N个已存储的具有唯一 ID 的数组,则有可能会在N+1个周期内生成下一个 ID。

如果您的项目不是高负载,就足够了,uniqid()或者uniqid('', true)如果您需要额外的熵。

于 2013-09-07T14:43:00.407 回答
1

替换echo $r;return $r;

function unique_array_key($the_array){
   $r = rand();
   if (array_key_exists("$r", $the_array)) {
     return unique_array_key($the_array);
   } else {
     return $r;
   }
}

}

于 2013-09-07T14:32:29.430 回答