次のループを使用して、$ listeと呼ばれる私の配列に項目を追加しています。値が既に配列にある場合、何らかの方法で$ liste配列に$ valueを追加しないことが可能かどうかを知りたいですか?私が明確であることを願っています。前もって感謝します。
$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
は「厳密なチェック」を有効にします。これは、===
の代わりに==
を使用して要素を比較します。
本当に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);
を探しているだけかもしれません。
この質問は最初からベストプラクティスコードを使用していないため、ここでのすべての答えは複雑すぎます。
問題のコードを解く:
基本的に、問題になっているのは、繰り返しを除外することです。より良いアプローチ:
$liste = array_unique($something);
空でない配列に要素を追加する場合:
$liste = array_unique(array_merge($liste, $something));
array_Push()を使用している場合:
配列プッシュの戻り値を実際に使用している場合を除き、実際に使用する必要があります。
$liste[] = $value;
短い構文とわずかなパフォーマンス向上のため
代わりに連想配列として使用したいかもしれません。 ハッシュテーブル のように実装されているため、線形ではなく一定の挿入時間が得られます。
function find_uniq( $something ) {
foreach($something as $value){
$liste[$value]++;
}
return array_keys( $liste );
}
array_Push()
を呼び出す前に、この条件を簡単に確認できます。 array_search()
を使用し、false
との強力な比較を使用して、値が存在するかどうかを確認します。
foreach( $something as $value ){
if( array_search( $value, $liste, true ) === false ){
array_Push( $liste, $value );
}
}
(ところで:,true
をarray_search
に追加して「厳格なチェック」を使用します。これは、比較のために===
の代わりに==
を使用します)
ロジックを節約し、ロジックレスに保つことで速度を改善します。上書きし続けるだけです。
$list = array();
foreach ($something as $value) {
if (!is_object($value) && !is_array($value)) {
$list[$value] = $value
}
}
$list = array_values($list);
別の解決策があります!キーを値として使用できます。また、-キーが重複することはありません。
$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]);
}
}
注:これは連想配列と連想配列では機能しません。
正しい答えははるかに簡単です。すべてをプッシュしますが、array_unique()
関数を使用します。
array_Push($array, $new_member);
$array = array_unique($array);
既に上記に素晴らしい答えがありますが、コード全体に複数の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に追加されます。
お役に立てば幸いです。