如何仅在元素尚未在数组中时才将元素添加到数组中?我有以下几点:
$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
将唯一的新值追加到当前值。
- http://ideone.com/JCakmR
- 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)));