确保生成的数组键是唯一的

时间:2013-09-07 14:29:38

标签: php arrays

我有这个数组

$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);本身似乎工作正常。为什么函数没有添加唯一键?。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

uniqid(php_uname('n'), true)

用于ID生成。生成rand() ID的解决方案只有mt_getrandmax()个版本。通常它是2147483647.如果以秒为单位生成10000个ID,您将在2.4 days中超出可用ID的限制,并且您的代码将以无限循环运行,因为数组中的每个键检查都将具有真实结果并递归调用新ID生成一次又一次。

此外,您的解决方案使应用程序性能取决于数据量。您将获得的数据多于由于重复而产生ID的额外循环的可能性。例如,如果您已经存储了具有唯一ID的 N 数组,则可能会为 N + 1 周期生成下一个ID。

如果您的项目没有高负载,如果您需要额外的熵,则会uniqid()uniqid('', true)

答案 1 :(得分: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;
   }
}

}