如果不存在,则添加到数组中

只有在数组中不存在的情况下,如何向数组添加元素? 我有以下几点:

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

你必须检查每个值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函数in_array (见http://php.net/manual/en/function.in-array.php )。

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

这是文档中有关in_array如果在数组中find in_array 返回TRUE ,否则返回FALSE

由于您似乎只有标量值 ,因此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而不是像其他人所build议的可能更直观。 但是,你最终将在O( n 2 )( in_array在O( n ))中的algorithm不适用。 即使推送数组中的所有值,并使用array_unique将比in_array更好( array_uniquesortingO( n ·log n )中的值,然后删除连续的重复项)。

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

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

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

尝试添加为键而不是值:

添加一个条目

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

获取所有条目

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

由于有很多方法可以完成预期的结果,所以很多人提供了!in_array()作为答案,OP已经提到了array_unique的使用,我想提供一些select。

使用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; } } 

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

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

这一个可能更快:

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

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

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

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