如果元素不在那里,我该如何添加元素?我有以下内容:
$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来获得所需的结果,但我只是想知道)
答案 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
)
另一种方法是使用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
)
答案 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)
答案 14 :(得分:-3)
试试这段代码,我是从here
获得的$input = Array(1,2,3,1,2,3,4,5,6);
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));