如果不存在,则添加到数组中
只有在数组中不存在的情况下,如何向数组添加元素? 我有以下几点:
$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_unique
sortingO( 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 )
另一种方法是使用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 )
无论哪种方法,您都可以使用array_merge
将唯一的新值附加到当前值。
结果:
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)));