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