Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何比较数组中的每个元素?_Php_Arrays_Unique - Fatal编程技术网

Php 如何比较数组中的每个元素?

Php 如何比较数组中的每个元素?,php,arrays,unique,Php,Arrays,Unique,我想比较数组中的每个元素 $char=array(); for($i=0;$i<=10;$i++) { $char[$i]=rand(0,35); } $char=array(); 对于($i=0;$i要将任何重复值更改为随机值,应在数组中循环两次: $cont= 0; foreach($char as $c){ foreach($char as $d){ if($c == $d){ //updating t

我想比较数组中的每个元素

 $char=array();    
 for($i=0;$i<=10;$i++)
 {
        $char[$i]=rand(0,35);
 }
$char=array();

对于($i=0;$i要将任何重复值更改为随机值,应在数组中循环两次:

$cont= 0;
foreach($char as $c){
    foreach($char as $d){
        if($c == $d){
            //updating the value
            $char[$cont] = rand(0,35);
        }
    }
    $cont++;
}

但我不知道的是,随机值是否也可以重复。在这种情况下,就不那么简单了。

要将任何重复值更改为随机值,您应该在数组中循环两次:

$cont= 0;
foreach($char as $c){
    foreach($char as $d){
        if($c == $d){
            //updating the value
            $char[$cont] = rand(0,35);
        }
    }
    $cont++;
}

但我不知道随机值是否也可以重复。在这种情况下,它就不会这么简单了。

在这个特定的示例中,如果可能值的范围非常小,最好用另一种方法:

$allPossible = range(0, 35);
shuffle($allPossible);

// Guaranteed exactly 10 unique numbers in the range [0, 35]
$char = array_slice($allPossible, 0, 10);
或使用以下等效版本:

如果值的范围更大,那么这种方法将非常浪费,您应该在每次迭代中检查唯一性:

$char = array();
for ($i = 0; $i < 10; ++$i) {
    $value = null;

    // Try random numbers until you find one that does not already exist
    while($value === null || in_array($value, $char)) {
        $value = rand(0, 35);
    }

    $char[] = $value;
}

在此特定示例中,如果可能值的范围非常小,最好采用另一种方法:

$allPossible = range(0, 35);
shuffle($allPossible);

// Guaranteed exactly 10 unique numbers in the range [0, 35]
$char = array_slice($allPossible, 0, 10);
或使用以下等效版本:

如果值的范围更大,那么这种方法将非常浪费,您应该在每次迭代中检查唯一性:

$char = array();
for ($i = 0; $i < 10; ++$i) {
    $value = null;

    // Try random numbers until you find one that does not already exist
    while($value === null || in_array($value, $char)) {
        $value = rand(0, 35);
    }

    $char[] = $value;
}

我从数据库中获取了此代码


我从数据库中获取了此代码


首先在
$char
数组上使用
array\u count\u values()


之后,您可以循环使用多于1的所有条目并将其随机化。您必须不断检查,直到所有计数都为1 tho。因为即使是随机数也可能会重新生成一个副本。

首先在
$char
数组上使用
array\u count\u values()


之后,您可以循环所有大于1的条目并将其随机化。您必须不断检查,直到所有计数都为1 tho。因为即使是随机数也可能会重新生成一个副本。

我建议使用两个选项创建随机数组:

    <?php
    $questions = array(1, 2, 3, 4, 5, ..., 34, 35);
    $questions = shuffle($questions);
    ?>


然后选择前10个元素。

我建议使用两个选项创建随机数组:

    <?php
    $questions = array(1, 2, 3, 4, 5, ..., 34, 35);
    $questions = shuffle($questions);
    ?>


然后选择前10个元素。

您可以尝试使用此代码替换任何重复的值

for ($i = 0; $i < count($char); $i++) {
    for ($n = 0; $n < count($char); $n++) {
        if($char[$i] == $char[$n]){
            $char[$i] = rand(0,35);
        }
    }
}
for($i=0;$i
您可以尝试使用此代码替换任何重复的值

for ($i = 0; $i < count($char); $i++) {
    for ($n = 0; $n < count($char); $n++) {
        if($char[$i] == $char[$n]){
            $char[$i] = rand(0,35);
        }
    }
}
for($i=0;$i
该函数从数组中获取所有唯一的值,并通过它们的第一次出现进行键控

该函数允许从一个数组中删除另一个数组中的值

根据您需要(或不需要)键入结果键或保留键的顺序,您需要执行多个步骤。通常情况下,它的工作原理与我在以下段落中概述的一样(使用PHP代码示例):

在一个数组中,有
N
元素,其中
Nu
是唯一的

$N  = array(...);
$Nu = array_unique($N);
然后您需要替换重复项的随机元素的数量是
N
的计数减去
Nu
的计数。由于
N
的计数通常是一个有用的值,我也将其分配给
nc

$nc = count($N);
$r  = $nc - count($Nu);
这使得
r
成为从
0
count(N)-1的整数:

           0 : no duplicate values / all values are unique
           1 : one duplicate value / all but one value are unique
            ...
count(N) - 1 : all duplicate values / no unique value
因此,如果您需要零随机值(
$r===0
),则输入
$N
就是结果。此边界条件是第二个最简单的结果(第一个简单结果是没有成员的输入数组)

对于所有其他情况,您需要
r
随机唯一值。在您的问题中,您要从0到35写入。但这不可能是全部内容。假设您的输入数组有36个重复值,0到35范围内的每个数字重复一次。将0到35范围内的随机数再次添加到数组将创建重复值再次保证

相反,我阅读了您的问题,您只是在寻找尚未成为输入数组一部分的唯一值

因此,您不仅需要
r
随机值(
Nr
),而且到目前为止,它们也不能是
N
Nu
的一部分

要实现这一点,您只需创建
count(N)
唯一值,请从这些值中删除唯一值
Nu
,以确保与
Nu
中的值不重复。由于这是理论上的最大值,而不是所需的确切数字,因此该数组用于从以下位置获得精确的
r
元素的切片:

$Nr = array_slice(array_diff(range(0, $nc - 1), $Nu), 0, $r);
如果您还希望在订购
range(0,$nc-1)
时将这些新值进行无序添加,则可以执行以下操作:

shuffle($Nr);
这会把你在问题中所要求的随机性带回到答案中

现在只剩下原始数组的唯一部分
$Nu
r
中的新值
$Nr
。合并这两个数组将得到一个忽略键=>值关系的结果数组(数组重新索引):

例如,对于
$N
,使用示例性
数组(3,4,2,1,4,0,5,0,3,5)
,结果如下:

Array
(
    [0] => 3
    [1] => 4
    [2] => 2
    [3] => 1
    [4] => 0
    [5] => 5
    [6] => 7
    [7] => 9
    [8] => 6
    [9] => 8
)
Array
(
    [0] => 3
    [1] => 4
    [2] => 2
    [3] => 1
    [5] => 0
    [6] => 5
    [4] => 8
    [7] => 6
    [8] => 9
    [9] => 7
)
如您所见,所有唯一值(0-5)都在开头,后面跟着新值(6-9)。原始键不保留,例如value
5
的键最初是
6
,现在是
5

由于
array\u merge()的原因,关系或key=>值未被保留
,它会对数字键进行重新索引。
Nr
键中的唯一数字旁边也需要在数组中是唯一的。因此,对于添加到unqique现有数字中的每个新数字,都需要使用一个作为重复数字键的键。要获得所有重复数字键,原始数组中的键集将减少by dupl匹配的所有键集
$Nr = array_combine($Kr, $Nr);
$Nu + $Nr;
Array
(
    [0] => 3
    [1] => 4
    [2] => 2
    [3] => 1
    [5] => 0
    [6] => 5
    [4] => 8
    [7] => 6
    [8] => 9
    [9] => 7
)
// the original array defines the order of keys:
$orderMap = array_flip(array_keys($N));

// define the sort order for the result with keys preserved
$Vt    = $Nu + $Nr;
$order = array();
foreach ($Vt as $key => $value) {
    $order[] = $orderMap[$key];
}
// sort an array by the defined order, preserve keys
$Vk = array_keys($Vt);
array_multisort($order, $Vt, $Vk);
array_combine($Vk, $Vt);
Array
(
    [0] => 3
    [1] => 4
    [2] => 2
    [3] => 1
    [4] => 7
    [5] => 0
    [6] => 5
    [7] => 8
    [8] => 6
    [9] => 9
)
$result = array();
foreach ($N as $key => $value) {
    $result[$key] = array_key_exists($key, $Nu) ? $Nu[$key] : array_pop($Nr);
}
Array
(
    [0] => 3
    [1] => 4
    [2] => 2
    [3] => 1
    [4] => 7
    [5] => 0
    [6] => 5
    [7] => 8
    [8] => 9
    [9] => 6
)
// original array
$array = array(3, 4, 2, 1, 4, 0, 5, 0, 3, 5);

// obtain unique values (1.)
$unique = array_unique($array);

// obtain new unique values (2.)
$new = range(0, count($array) - 1);
$new = array_diff($new, $unique);
shuffle($new);

// process original array (3.)
foreach ($array as $key => &$value) {
    if (array_key_exists($key, $unique)) {
        continue;
    }
    $value = array_pop($new);
}
unset($value, $new);

// result in $array:
print_r($array);
Array
(
    [0] => 3
    [1] => 4
    [2] => 2
    [3] => 1
    [4] => 9
    [5] => 0
    [6] => 5
    [7] => 8
    [8] => 7
    [9] => 6
)