簡體   English   中英

循環時僅將唯一值推入數組

[英]Push only unique values into an array while looping

我正在使用以下循環將項目添加到數組中。 我想知道如果值已經在數組中,是否有可能不將$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啟用“嚴格檢查”。 這比較使用===而不是==的元素。

真的有兩個選擇。

選項 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():

除非您實際使用數組推送的返回值,否則您應該真正使用:

$liste[] = $value;

用於更短的語法和較小的性能提升

也許您想將其用作關聯數組。 它被實現為(類似於) hash 表,因此您可以獲得恆定的插入時間而不是線性的。

function 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() function:

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添加到array_search以使用“嚴格檢查”。這將使用===進行比較而不是==

我有另一個解決方案給你! 您可以使用鍵作為值,並且鍵永遠不會重復

$arr = ["A" => true, "B" => true, "C" => true];

$item = "A";
$arr[$item] = true;

用法:

foreach($arr as $value => $helper){
    echo $value;
}

設置 class

好的,我給你寫一個class。 arrays 不允許重復項稱為集合。

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]);
    }
}

注意:這不適用於關聯 arrays 和值。

上面已經給出了很好的答案,但是如果你的代碼中有多個 array_push() ,那么每次都編寫 if(in_array()) 語句會很痛苦。

這是一個可以縮短您的代碼的解決方案:使用單獨的 function。

function arr_inserter($arr,$add){ //to prevent duplicate when inserting
    if(!in_array($add,$arr))
        array_push($arr,$add);
    return $arr;
}

然后,在您所有的 array_push() 需求中,您可以調用上面的 function,如下所示:

$liste = array();
foreach($something as $value){
    $liste = arr_inserter($liste, $value);
}

如果 $value 已經存在,則 $liste 保持不變。

如果 $value 還不存在,它被添加到 $liste。

希望有所幫助。

通過保持無邏輯來節省邏輯並提高速度。 只是繼續覆蓋。

$list = array();
foreach ($something as $value) {
  if (!is_object($value) && !is_array($value)) {
    $list[$value] = $value
  }
}
$list = array_values($list);

您可以使用值作為臨時鍵,只要$something數組不包含:

  1. 非標量值(對象/數組/等不能用作鍵)或
  2. 用作數組鍵時將發生變異的值(浮點數被截斷,空值變為空字符串,布爾值變為整數)
  3. 數字字符串和整數的混合,將松散地評估為相等( 2 vs "2"

糟糕的演示


代碼:(好的演示

$something = [3, 2, 1, 3, 6, 5, 1, 1];
$liste = [];
foreach ($something as $value) {
     $liste[$value] = $value;
}

Output:

array (
  3 => 3,
  2 => 2,
  1 => 1,
  6 => 6,
  5 => 5,
)

上面的方法絕對比本頁上使用重復檢查技術的任何其他方法表現得更好。 PHP 不允許在數組的任何一個級別上重復鍵,因此它只會覆蓋重新遇到的值。

如果新鍵不影響未來的處理,請保持原樣,否則調用array_values()重新索引數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM