我正在使用以下循环将项目添加到数组中。我想知道是否有可能在值已经存在于数组中时不将$value
添加到$liste
数组中?
$liste = array();
foreach($something as $value){
array_push($liste, $value);
}
我正在使用以下循环将项目添加到数组中。我想知道是否有可能在值已经存在于数组中时不将$value
添加到$liste
数组中?
$liste = array();
foreach($something as $value){
array_push($liste, $value);
}
在推入数据之前,您可以使用in_array
检查其是否已存在。
foreach($something as $value){
if(!in_array($value, $liste, true)){
array_push($liste, $value);
}
}
,true
启用了“严格检查”,这会使用===
而不是==
来比较元素。
$value
是数字,并恰好与$liste
中的一个(数字)键相同,则in_array()
可能会返回true
,即使在数组中没有这样的值。我建议改用array_search()
函数并将结果与false
进行强类型比较。 - Jazzin_array
只搜索数组的值,而不是键。http://ideone.com/JjkuP - gen_Ericin_array
中添加,true
来启用“严格检查”来解决这些问题。此外,这些问题与数组中的键值无关,而与PHP的奇怪的“类型转换”有关。另外,array_search
也会出现相同的问题。 - gen_Ericin_array()
的问题 - 它不是与数字键有问题,而是与弱类型转换有问题。我的错误!在我之前使用它的代码中,严格模式不是一个选项(我需要'2'
与2
相同而与'2thing'
不同)。我仍然建议新的PHP开发人员使用array_search()
,因为它比in_array()
具有更少的“陷阱”。教训是 - 无论您使用什么,确保您知道何时它不起作用。 - Jazz有两个选项。
选项1:对于每个项进行检查,如果已存在该项,则不推入。基本上就是你所要求的:
foreach($something as $value) {
if( !in_array($value,$liste)) array_push($liste,$value);
}
选项2:将它们添加到列表中,然后在之后去重:
foreach($something as $value) {
array_push($liste,$value);
}
$liste = array_unique($liste);
从外表看,您可能只是在寻找$liste = array_unique($something);
。
由于这个问题最初使用的不是最佳实践代码,因此我发现这里所有的答案都过于复杂。
解决问题的代码:
基本上,在问题本身中尝试过滤重复项。更好的方法:
$liste = array_unique($something);
如果向一个非空数组中添加元素:
$liste = array_unique(array_merge($liste, $something));
如果您正在使用array_push()函数:
除非您实际上需要使用array_push()的返回值,否则您应该使用:
$liste[] = $value;
为了缩短语法并略微提高性能。array_push($liste,...array_diff($something,$liste));
(不知道这在性能上如何比较)。 - Headbankfunction find_uniq( $something ) {
foreach($something as $value){
$liste[$value]++;
}
return array_keys( $liste );
}
如果你想抑制警告,请在第三行加上@
符号。
如果你想避免警告,你需要先检查是否存在:
function find_uniq( $something ) {
foreach($something as $value){
if (isset($liste[$value]))
$liste[$value]++;
else
$liste[$value] = 1;
}
return array_keys( $liste );
}
array_unique()
函数:array_push($array, $new_member);
$array = array_unique($array);
在调用array_push()
之前,您可以简单地检查此条件。使用array_search()
并使用强比较false
来查看值是否存在:
foreach( $something as $value ){
if( array_search( $value, $liste, true ) === false ){
array_push( $liste, $value );
}
}
,true
可以使用“严格检查”。这将使用===
而不是==
进行比较。)in_array
的信息,但那是完全错误的。in_array
仅搜索值,而不是键。http://ideone.com/JjkuP - gen_Ericarray_search
也会出现相同的问题。您需要添加,true
以启用“严格检查”来解决此问题。否则它将使用==
进行比较(例如'2dudes' == 2
)。 - gen_Eric$arr = ["A" => true, "B" => true, "C" => true];
$item = "A";
$arr[$item] = true;
使用方法:
foreach($arr as $value => $helper){
echo $value;
}
好的,让我为您编写一个类!不允许重复项的数组被称为集合。
class Set{
private $countainer;
public function get(){
return $this->container;
}
public function push($item){
$this->container[$item] = true;
}
public function delete($item){
unset($this->container[$item]);
}
}
$list = array();
foreach ($something as $value) {
if (!is_object($value) && !is_array($value)) {
$list[$value] = $value
}
}
$list = array_values($list);
is_scalar()
可以提高“优雅性”。 - mickmackusafunction arr_inserter($arr,$add){ //to prevent duplicate when inserting
if(!in_array($add,$arr))
array_push($arr,$add);
return $arr;
}
然后在你所有的array_push()需求中,你可以像这样调用上述函数:
$liste = array();
foreach($something as $value){
$liste = arr_inserter($liste, $value);
}
您可以使用值作为临时键,只要$something
数组不包含以下内容:
2
vs "2"
)(错误演示)
代码:(好的演示)
$something = [3, 2, 1, 3, 6, 5, 1, 1];
$liste = [];
foreach ($something as $value) {
$liste[$value] = $value;
}
输出:
array (
3 => 3,
2 => 2,
1 => 1,
6 => 6,
5 => 5,
)
array_values()
重新索引数组。
$value
是什么。它是一个标量值吗?它始终是一个整数吗?还是一个字符串?根据这个重要的细节,可能会有比进行迭代调用in_array()
更有效的方法。 - mickmackusa