添加到数组(如果尚未存在)


add to array if it isn't there already

如何仅在元素尚未在数组中时才将元素添加到数组中?我有以下几点:

$a=array();
// organize the array
foreach($array as $k=>$v){
    foreach($v as $key=>$value){
        if($key=='key'){
        $a[]=$value;
        }
    }
}
print_r($a);

//输出

Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 1
[4] => 2
[5] => 3
[6] => 4
[7] => 5
[8] => 6
)

相反,我希望$a由唯一值组成。(我知道我可以使用array_unique来获得所需的结果,但我只是想知道)

你应该使用 PHP 函数in_array(见 http://php.net/manual/en/function.in-array.php)。

if (!in_array($value, $array))
{
    $array[] = $value; 
}

这是文档对in_array所说的:

如果在数组中找到针,则返回 TRUE,否则返回 FALSE

您必须

根据in_array检查每个值:

$a=array();
// organize the array by cusip
foreach($array as $k=>$v){
    foreach($v as $key=>$value){
        if(!in_array($value, $a)){
        $a[]=$value;
        }
    }
}

由于您似乎只有标量值,因此 PHP 的数组是一个哈希映射,因此您可以使用该值作为键以避免重复并将$k键关联到它们以获得原始值:

$keys = array();
foreach ($array as $k => $v){
    if (isset($v['key'])) {
        $keys[$value] = $k;
    }
}

然后你只需要迭代它来获取原始值:

$unique = array();
foreach ($keys as $key) {
    $unique[] = $array[$key]['key'];
}

这可能不是最明显和最全面的方法,但它在 O(n) 中非常有效。

像其他人建议的那样使用 in_array 可能更直观。但是你最终会得到一个不适用的 O(n2) (in_array 在 O(n)) 中的算法。即使推送数组中的所有值并在其上使用array_unique也比in_array更好(array_unique对 O(n·log n) 中的值进行排序,然后删除连续的重复项)。

if (!in_array(...))  
  array_push(..)

容易写,但不是最有效的:

$array = array_unique(array_merge($array, $array_to_append));

这个可能更快:

$array = array_merge($array, array_diff($array_to_append, $array));
if (!in_array($value, $a))
  $a[]=$value;

尝试添加为键而不是值:

添加条目

function addEntry($entry) {
    $this->entries[$entry] = true;
}

获取所有条目

function getEntries() {
    return array_keys($this->enties);
}

如果你同意在代码中使用速记(而不是像一些编码标准推荐的那样编写显式if块),你可以用这句话进一步简化Marius Schulz的回答:

in_array ($value, $array) || $array [] = $value;

如果您不关心键的顺序,则可以执行以下操作:

$array = YOUR_ARRAY
$unique = array();
foreach ($array as $a) {
    $unique[$a] = $a;
}
由于有很多

方法可以实现预期的结果,并且很多人提供了!in_array()作为答案,并且 OP 已经提到了array_unique的使用,我想提供几种替代方案。

使用 array_diff (php>= 4.0.1 || 5),您可以只过滤掉不存在的新数组值。或者,您也可以将键和值与 array_diff_assoc 进行比较。http://php.net/manual/en/function.array-diff.php

$currentValues = array(1, 2);
$newValues = array(1, 3, 1, 4, 2);
var_dump(array_diff($newValues, $currentValues));

结果:

Array
(
    [1] => 3
    [3] => 4
)

http://ideone.com/SWO3D1

另一种方法是使用 array_flip 将值分配为键并使用 isset 进行比较,这将比使用大型数据集的in_array执行速度快得多。同样,这将仅过滤掉当前值中尚不存在的新值。

$currentValues = [1, 2];
$newValues = [1, 3, 1, 4, 2];
$a = array();
$checkValues = array_flip($currentValues);
foreach ($newValues as $v) {
    if (!isset($checkValues[$v])) {
        $a[] = $v;
    }
}

结果:

Array
(
    [0] => 3
    [1] => 4
)

http://ideone.com/cyRyzN

使用任一方法,您都可以使用 array_merge 将唯一的新值追加到当前值。

  1. http://ideone.com/JCakmR
  2. http://ideone.com/bwTz2u

结果:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)
你可以

尝试使用"in_array":

function insert_value($value, &$_arr) {
    if (!in_array($value, $_arr)) {
        $_arr[] = $value;
    }
}

采用 Gumbo 的想法,使代码工作:

$array = array('111111','222222','3333333','4444','5555', 
'AAAAAA', 'BBBBBB', 'CCC', 'DDDDDDD', 'EEEEEEEE', 'FFFFFF', 'GGG',
'AAAAAA', 'BBBBBB', 'CCC', 'DDDDDDD', 'EEEEEEEE', 'FFFFFF', 'GGG',
'222222', 
'666666', '777777', 'HHHH');
print_r($array);
$keys= array();
foreach ($array as $k => $v){
    if (isset($v['value'])) {
        $keys[$v] = $k;
    }
}
$unique = array();
foreach ($keys as $key) {
    $unique[] = $array[$key];
}
print "<br><br>";
print_r($unique);

给出这个:

Array
(
    [0] => 111111
    [1] => 222222
    [2] => 3333333
    [3] => 4444
    [4] => 5555
    [5] => AAAAAA
    [6] => BBBBBB
    [7] => CCC
    [8] => DDDDDDD
    [9] => EEEEEEEE
    [10] => FFFFFF
    [11] => GGG
    [12] => AAAAAA
    [13] => BBBBBB
    [14] => CCC
    [15] => DDDDDDD
    [16] => EEEEEEEE
    [17] => FFFFFF
    [18] => GGG
    [19] => 222222
    [20] => 666666
    [21] => 777777
    [22] => HHHH
)
Array
(
    [0] => 111111
    [1] => 222222
    [2] => 3333333
    [3] => 4444
    [4] => 5555
    [5] => AAAAAA
    [6] => BBBBBB
    [7] => CCC
    [8] => DDDDDDD
    [9] => EEEEEEEE
    [10] => FFFFFF
    [11] => GGG
    [12] => 666666
    [13] => 777777
    [14] => HHHH
)

有了array_flip(),它可能看起来像这样:

$flipped = array_flip($opts);
$flipped[$newValue] = 1;
$opts = array_keys($flipped);

有了array_unique() - 像这样:

$opts[] = $newValue;
$opts = array_values(array_unique($opts));

请注意,array_values(...) — 如果要以 JSON 形式将数组导出到 JavaScript,则需要它。 仅array_unique()将简单地取消设置重复的键,而无需重建其余元素。因此,在转换为 JSON 后,这将生成对象,而不是数组。

>>> json_encode(array_unique(['a','b','b','c']))
=> "{"0":"a","1":"b","3":"c"}"
>>> json_encode(array_values(array_unique(['a','b','b','c'])))
=> "["a","b","c"]"

试试这段代码,我从这里得到它

$input = Array(1,2,3,1,2,3,4,5,6);
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));