web-dev-qa-db-ja.com

php array_Push()->配列に既に値が含まれている場合にプッシュしない方法

次のループを使用して、$ listeと呼ばれる私の配列に項目を追加しています。値が既に配列にある場合、何らかの方法で$ liste配列に$ valueを追加しないことが可能かどうかを知りたいですか?私が明確であることを願っています。前もって感謝します。

$liste = array();
foreach($something as $value){
     array_Push($liste, $value);
}
37
Marc

プッシュする前に in_array を使用して、そこにあるかどうかを確認します。

foreach($something as $value){
    if(!in_array($value, $liste, true)){
        array_Push($liste, $value);
    }
}

,trueは「厳密なチェック」を有効にします。これは、===の代わりに==を使用して要素を比較します。

77
Rocket Hazmat

本当に2つのオプション。

オプション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);を探しているだけかもしれません。

19

この質問は最初からベストプラクティスコードを使用していないため、ここでのすべての答えは複雑すぎます。

問題のコードを解く:

基本的に、問題になっているのは、繰り返しを除外することです。より良いアプローチ:

$liste = array_unique($something);

空でない配列に要素を追加する場合:

$liste = array_unique(array_merge($liste, $something));

array_Push()を使用している場合:

配列プッシュの戻り値を実際に使用している場合を除き、実際に使用する必要があります。

$liste[] = $value;

短い構文とわずかなパフォーマンス向上のため

3
NoOorZ24

代わりに連想配列として使用したいかもしれません。 ハッシュテーブル のように実装されているため、線形ではなく一定の挿入時間が得られます。

function find_uniq( $something ) {
    foreach($something as $value){
         $liste[$value]++;
    }
    return array_keys( $liste );
}
3
bjelli

array_Push()を呼び出す前に、この条件を簡単に確認できます。 array_search()を使用し、falseとの強力な比較を使用して、値が存在するかどうかを確認します。

foreach( $something as $value ){
    if( array_search( $value, $liste, true ) === false ){
        array_Push( $liste, $value );
    }
}

(ところで:,truearray_searchに追加して「厳格なチェック」を使用します。これは、比較のために===の代わりに==を使用します)

3
Jazz

ロジックを節約し、ロジックレスに保つことで速度を改善します。上書きし続けるだけです。

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

別の解決策があります!キーを値として使用できます。また、-キーが重複することはありません

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

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

使用法:

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

クラスを設定

OK、クラスを書いてみましょう!配列は、セットと呼ばれる重複したアイテムを許可しません。

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

注:これは連想配列と連想配列では機能しません。

0
Amir Forsati

正しい答えははるかに簡単です。すべてをプッシュしますが、array_unique()関数を使用します。

array_Push($array, $new_member);
$array = array_unique($array);
0
Nick

既に上記に素晴らしい答えがありますが、コード全体に複数のarray_Push()がある場合、毎回if(in_array())ステートメントを書くのは面倒です。

その場合のコードを短縮するソリューションは次のとおりです。別の関数を使用します。

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

$ valueが既に存在する場合、$ listeは変更されません。

$ valueがまだ存在しない場合、$ listeに追加されます。

お役に立てば幸いです。

0
ITWitch