添加到数组,如果它还没有

时间:2011-05-21 18:18:16

标签: php

如果元素不在那里,我该如何添加元素?我有以下内容:

$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来获得所需的结果,但我只是想知道)

15 个答案:

答案 0 :(得分:95)

您应该使用PHP函数in_array(请参阅http://php.net/manual/en/function.in-array.php)。

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

这是文档中关于in_array的说法:

  

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

答案 1 :(得分:58)

您必须针对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;
        }
    }
}

答案 2 :(得分:28)

由于您似乎只有scalar values 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( n 2 )的算法(in_array在O( n )),这是不适用。即使推送数组中的所有值并在其上使用array_unique也会比in_array更好(array_unique对O中的值进行排序( n ·log n )然后删除连续的重复项。)

答案 3 :(得分:11)

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

答案 4 :(得分:7)

易于编写,但不是最有效的:

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

这个可能更快:

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

答案 5 :(得分:5)

if (!in_array($value, $a))
  $a[]=$value;

答案 6 :(得分:3)

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

$array = YOUR_ARRAY
$unique = array();
foreach ($array as $a) {
    $unique[$a] = $a;
}

答案 7 :(得分:3)

尝试添加键而不是值:

添加条目

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

获取所有条目

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

答案 8 :(得分:3)

由于有很多方法可以达到预期的效果,很多人提供!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
  3. 结果:

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

答案 9 :(得分:1)

您可以尝试使用“in_array”:

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

答案 10 :(得分:0)

使用Gumbo's idea,使代码正常工作:

$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
)

答案 11 :(得分:0)

如果您可以在代码中使用速记(而不是像某些编码标准建议那样编写显式的if块),则可以进一步通过这种单线简化Marius Schulz's answer

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

答案 12 :(得分:0)

使用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"]"

答案 13 :(得分:-1)

更好更简单的本机方式:

$array = $array_1 + $array_2;

请参阅:Array Operators: union.

答案 14 :(得分:-3)

试试这段代码,我是从here

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