Heim > php教程 > php手册 > 奇怪的array_unique有关问题

奇怪的array_unique有关问题

WBOY
Freigeben: 2016-06-06 19:41:27
Original
1470 Leute haben es durchsucht

奇怪的array_unique问题 $cardsn是个一维数组,里面是我生成的会员卡随机数,我想用array_unique去重 直接上代码: echo"去重前数组元素数:"count($cardsn); $cardsnu=array_unique($cardsn); echo"br去重后的唯一数组元素数:";count($cardsnu); 猜猜结果是

奇怪的array_unique问题
$cardsn是个一维数组,里面是我生成的会员卡随机数,我想用array_unique去重
直接上代码:
<br />
echo "去重前数组元素数:"count($cardsn);<br />
$cardsnu=array_unique($cardsn);<br />
echo "<br>去重后的唯一数组元素数:"; count($cardsnu);<br />
Nach dem Login kopieren


猜猜结果是什么?
<br />
去重前数组元素数:20000<br />
去重后的唯一数组元素数:16384<br />
Nach dem Login kopieren


然后把原数组$cardsn长度修剪为17000,重新执行,结果如下
<br />
去重前数组元素数:17000<br />
去重后的唯一数组元素数:16384<br />
Nach dem Login kopieren



再次把原数组长度修建为16123,执行结果如下
<br />
去重前数组元素数:16123<br />
去重后的唯一数组元素数:16123<br />
Nach dem Login kopieren



经过测试发现,貌似array_unique这个方法只能处理16384个元素,不管原数组有多少个元素(只要长度超过16384),那么使用array_unique处理的唯一数组最大长度也就是16384,求大神讲解下原理。

------解决思路----------------------
<br />
$arr = range(1,10000);<br />
$arr1 = range(1, 18000);<br />
$arr2 = array_merge($arr, $arr1);<br />
$c = array_unique($arr2);<br />
echo count($c); // 18000<br />
Nach dem Login kopieren


应该不会出现你的问题,估计是你原数组的数据就是这样。
------解决思路----------------------
引用:
我是这么做的:

<br />
		$str="123456789ABCDEFGHJKLMNPQRSTUVWXYZ123456789";<br />
		$cardsn=array();<br />
		$cardsnu=array();<br />
		for($i=0;$i<20000;$i++)<br />
		{<br />
			array_push($cardsn,date("y",time()).substr(str_shuffle($str),0,16));<br />
		}<br />
		<br />
		echo "去重前数组元素数:".count($cardsn);<br />
		$cardsnu=array_unique($cardsn);<br />
		echo "<br>去重后的唯一数组元素数:".count($cardsnu);<br />
Nach dem Login kopieren


结果还是我原来的样子,惨啊....


我这边执行是:
去重前数组元素数:20000
去重后的唯一数组元素数:20000

我的是php5.6
------解决思路----------------------
1、str_shuffle 只返回乱序的结果串,而不改变原串的值。因此 str_shuffle 每次返回的值是和 rand 返回值是对应的
2、随【本文来自鸿网互联 (http://www.68idc.cn)】机数发生器(rand)产生的是伪随机数序列,其周期为 32768,。即在 32768 个之内是不会出现重复的,而之外则必然重复
3、不知道你用的是什么版本的 php,为何伪随机数周期是 16384
4、如果你想突破 32768 的限制,那么需要自己写伪随机数发生器
$rand= ($rand * $m + $c) % $maxrand;
Nach dem Login kopieren

选取适当的 $m、$c 就可保证在 $maxrand 之内不重复
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage