php - warning - unset unset




PHP:配列から要素を削除する (20)

foreach ($array)にその要素が含まれないように、 PHPを使用して配列から要素を削除する簡単な方法はありますか?

私はそれをnull設定するとそれを行うと思ったが、明らかに動作しません。


unsetインデックスを変更せずにarray_spliceを実行する

$arrayName = array( '1' => 'somevalue',
                        '2' => 'somevalue1',
                        '3' => 'somevalue3',
                        500 => 'somevalue500',
                             );


    echo $arrayName['500']; 
    //somevalue500
    array_splice($arrayName, 1,2);

    print_r( $arrayName );
    //Array ( [0] => somevalue [1] => somevalue500 )



    $arrayName = array( '1' => 'somevalue',
                        '2' => 'somevalue1',
                        '3' => 'somevalue3',
                        500 => 'somevalue500',
                             );


    echo $arrayName['500']; 
    //somevalue500
    unset($arrayName[1]);

    print_r( $arrayName );
    //Array ( [0] => somevalue [1] => somevalue500 )

連想配列

連想配列の場合は、 unset()使用します。

$arr = array('a' => 1, 'b' => 2, 'c' => 3);
unset($arr['b']);

// RESULT : array('a' => 1, 'c' => 3)

数値配列

数値配列の場合は、 array_splice()使用します。

$arr = array(1, 2, 3);
array_splice($arr, 1, 1);

// RESULT : array(0 => 1, 1 => 3)

注意

数値配列にunset()を使用してもエラーは発生しませんが、インデックスが壊れてしまいます:

$arr = array(1, 2, 3);
unset($arr[1]);

// RESULT : array(0 => 1, 2 => 3)

PHPの配列から要素を削除する場合、使用する良い関数はunset関数です。 その使用例を以下に示します。

$anArray = array("X", "Y", "Z");

unset($anArray[0]);

//'dumps' the content of $anArray to the page:
var_dump($anArray);  

var_dump関数の出力は次のようになります。

array(2) { [1]=> string(1) "Y" [2]=> string(1) "Z" }

unset()は文字列インデックス(ハッシュテーブルとしての配列)を使用するときに期待されるものであるが、整数インデックス配列を扱うときは非常に驚くかもしれません。

$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [3]=>
  int(3)
} */

$array = array(0, 1, 2, 3);
array_splice($array, 2, 1);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */

したがって、整数キーを正規化する場合は、 array_splice()を使用することができます。 別のオプションは、 unset()後にarray_values()を使用しています:

$array = array(0, 1, 2, 3);

unset($array[2]);
$array = array_values($array);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */

キーに基づいて配列要素を削除する:

以下のようなunset関数を使用してください:

$a = array(
    'salam',
    '10',
    1
);

unset( $a[1] );

print_r( $a );

/*

Output:

Array
(
    [0] => salam
    [2] => 1
)

*/

値に基づいて配列要素を削除する:

array_search関数を使用して要素キーを取得し、上記のように配列要素を削除します。

$a = array(
    'salam',
    '10',
    1
);

$key = array_search( 10, $a );

if( $key !== false ) {
    unset( $a[ $key ] );
}

print_r( $a );

/*

Output:

Array
(
    [0] => salam
    [2] => 1
)

*/

ソリューション:

  1. 1つの要素を削除するには、 unset()使用します。
unset($array[3]);
unset($array['foo']);
  1. 連続していない複数の要素を削除するには、 unset()も使用します。
unset($array[3], $array[5]);
unset($array['foo'], $array['bar']);
  1. 複数の連続する要素を削除するには、 array_splice()使用します。
array_splice($array, $offset, $length);

さらなる説明:

これらの関数を使用すると、PHPからこれらの要素への参照がすべて削除されます。 配列にキーを保持したいが値が空の場合は、空の文字列を要素に割り当てます。

$array[3] = $array['foo'] = '';

構文のほかに、 unset()を使用して要素に ''を割り当てることには論理的な違いがあります。 最初は言いますThis doesn't exist anymore, 、2番目は「 This still exists, but its value is the empty string.と言っていThis still exists, but its value is the empty string.

数字を扱っている場合は、0を割り当てる方が良いかもしれません。 したがって、モデルXL1000スプロケットの生産を停止した企業は、在庫を次のように更新します。

unset($products['XL1000']);

しかし、一時的にXL1000スプロケットから逃げたが、今週末にプラントから新しい貨物を受け取る予定だった場合、これはより良い:

$products['XL1000'] = 0;

要素をunset()た場合、PHPは配列を調整してループが正しく動作するようにします。 配列を圧縮して欠落した穴を埋めるわけではありません。 これは、すべての配列が数値であるように見えても連想であると言ったときの意味です。 ここに例があります:

// create a "numeric" array
$animals = array('ant', 'bee', 'cat', 'dog', 'elk', 'fox');
print $animals[1];  // prints 'bee'
print $animals[2];  // prints 'cat'
count($animals);    // returns 6

// unset( )
unset($animals[1]); // removes element $animals[1] = 'bee'
print $animals[1];  // prints '' and throws an E_NOTICE error
print $animals[2];  // still prints 'cat'
count($animals);    // returns 5, even though $array[5] is 'fox'

// add new element
$animals[ ] = 'gnu'; // add new element (not Unix)
print $animals[1];  // prints '', still empty
print $animals[6];  // prints 'gnu', this is where 'gnu' ended up
count($animals);    // returns 6 

// assign ''
$animals[2] = '';   // zero out value
print $animals[2];  // prints ''
count($animals);    // returns 6, count does not decrease

配列を密度の高い数値配列にarray_values()するには、 array_values()使用します。

$animals = array_values($animals);

array_splice()配列を自動的に再インデクスして穴を残さないようにします:

// create a "numeric" array
    $animals = array('ant', 'bee', 'cat', 'dog', 'elk', 'fox');
    array_splice($animals, 2, 2);
    print_r($animals);
    Array
    (
        [0] => ant
        [1] => bee
        [2] => elk
        [3] => fox
    )

これは、配列をキューとして使用していて、ランダムアクセスを許可している間にアイテムをキューから削除したい場合に便利です。 最初または最後の要素を配列から安全に削除するには、それぞれarray_shift()およびarray_pop()を使用します。


これは助けるかもしれません...

<?php
    $a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
    $a2=array("a"=>"purple","b"=>"orange");
    array_splice($a1,0,2,$a2);
    print_r($a1);
    ?>

結果は次のようになります。

Array ( [0] => purple [1] => orange [c] => blue [d] => yellow )

すべての値が一意である(または一意ではないが、特定の値のすべてのインスタンスを削除する)数値的に配列された配列を持つ場合、array_diff()を使用して一致する要素を削除することができます。

$my_array = array_diff($my_array, array('Value_to_remove'));

例えば:

$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);

これにより、以下が表示されます。

4
3

この例では、値 'Charles'を持つ要素は、最初の配列では4、削除後では3のサイズを報告するsizeof()呼び出しで検証できるように削除されています。


また、名前付き要素の場合:

unset($array["elementName"]);


デフォルト機能に従う

i)

$Array = array("test1","test2","test3","test3");

unset($Array[2]);

ii)

$Array = array("test1","test2","test3","test3");

array_pop($Array);

iii)

$Array = array("test1","test2","test3","test3");

array_splice($Array,1,2);

iv)

$Array = array("test1","test2","test3","test3");

array_shift($Array);

私は、可変属性を持つ特定のObjectを持っていると言いたいと思います(基本的にテーブルをマッピングしていて、テーブルの列を変更していたので、テーブル内の属性も変わります)

class obj {
    protected $fields = array('field1','field2');
    protected $field1 = array();
    protected $field2 = array();
    protected loadfields(){} 
    // This will load the $field1 and $field2 with rows of data for the column they describe
    protected function clearFields($num){
        foreach($fields as $field) {
            unset($this->$field[$num]); 
            // This did not work the line below worked
            unset($this->{$field}[$num]); // You have to resolve $field first using {}
        }
    }
}

$フィールドの全体の目的は変更されたので、コード内のどこをでも見る必要はありませんでした。クラスの始めを見て、属性のリストと$ fields配列の内容を変更して、新しい属性。

これを理解するのに少し時間がかかりました。 これが誰かを助けることができるといいですね。


連想配列から複数の要素を削除する必要がある場合、 array_diff_key()使用することができます(ここではarray_flip()で使用されarray_flip() )。

$my_array = array(
  "key1" => "value 1",
  "key2" => "value 2",
  "key3" => "value 3",
  "key4" => "value 4",
  "key5" => "value 5",
);

$to_remove = array("key2", "key4");

$result = array_diff_key($my_array, array_flip($to_remove));

print_r($result);

出力:

Array ( [key1] => value 1 [key3] => value 3 [key5] => value 5 ) 

配列内の複数の値を削除する必要があり、その配列内のエントリがオブジェクトまたは構造化データである場合、 [array_filter][1]が最適です。 コールバック関数からtrueを返すエントリは保持されます。

$array = [
    ['x'=>1,'y'=>2,'z'=>3], 
    ['x'=>2,'y'=>4,'z'=>6], 
    ['x'=>3,'y'=>6,'z'=>9]
];

$results = array_filter($array, function($value) {
    return $value['x'] > 2; 
}); //=> [['x'=>3,'y'=>6,z=>'9']]

配列要素を削除するにはいくつかの方法がありますが、いくつかは特定のタスクに対して他のものよりも便利です。

1つの配列要素を削除する

1つの配列要素だけを削除したい場合は、 unset()またはalternative array_splice()使用できます。

値を持っていて、要素を削除するキーがわからない場合は、 array_search()を使ってキーを取得することもできます。

unset()メソッド

unset()を使用すると、配列キーは変更/再インデックスされません。 キーのarray_values()する場合は、 unset()後にarray_values()使用します。これは、すべてのキーを0から始まる数値の列挙型キーに変換します。

コード

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    unset($array[1]);
               //↑ Key which you want to delete

?>

出力

Array (
    [0] => a
    [2] => c
)

array_splice()メソッド

array_splice()を使用すると、キーは自動的に再array_values()れますが、すべてのキーを数値キーに変換するarray_values()ではなく、関連キーは変更されません。

array_splice()には、キーではなくオフセットが必要です。 2番目のパラメータとして使用します。

コード

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    array_splice($array, 1, 1);
                       //↑ Offset which you want to delete

?>

出力

Array (
    [0] => a
    [1] => c
)

array_splice() unset() array_splice()と同じですが、配列を参照すると、これらの関数の戻り値を配列に戻したくないということです。

複数の配列要素を削除する

unset()またはarray_splice()複数回呼びたくない場合は、配列の要素またはarray_diff_key()の値またはキーが分かっているかどうかに応じて、関数array_diff()またはarray_diff_key()を使用できます。あなたは削除したい。

array_diff()メソッド

あなたが削除したい配列要素の値を知っているなら、 array_diff()使うことができます。 以前のunset()と同様に、配列のキーを変更/再インデックスすることはありません。

コード

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    $array = array_diff($array, ["a", "c"]);
                              //└────────┘→ Array values which you want to delete

?>

出力

Array (
    [1] => b
)

array_diff_key()メソッド

削除したい要素のキーがわかっているなら、 array_diff_key()を使いたいと思う。 ここでは、キーではなく2番目のパラメータのキーとしてキーを渡す必要があります。 それ以外の場合は、 array_flip()配列を反転する必要があります。 また、ここでキーは変更/再インデックスされません。

コード

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    $array = array_diff_key($array, [0 => "xy", "2" => "xy"]);
                                   //↑           ↑ Array keys which you want to delete
?>

出力

Array (
    [1] => b
)

また、 unset()またはarray_splice()を使用して同じ値の複数の要素を削除する場合は、 array_keys()を使用して特定の値のすべてのキーを取得し、すべての要素を削除できます。


$x = array(1, 2, 3, 4, 5);
var_dump($x);
unset($x[3]); // here is key to be delete
echo '<br>';
array_values($x);
var_dump($x);


  // our initial array  
   $arr = array("blue", "green", "red", "yellow", "green", "orange", "yellow", "indigo", "red");  
  print_r($arr);

  // remove the elements who's values are yellow or red  
   $arr = array_diff($arr, array("yellow", "red"));
  print_r($arr);  

これは上のコードからの出力です:

Array
(
    [0] => blue
    [1] => green
    [2] => red
    [3] => yellow
    [4] => green
    [5] => orange
    [6] => yellow
    [7] => indigo
    [8] => red
)

Array
(
    [0] => blue
    [1] => green
    [4] => green
    [5] => orange
    [7] => indigo
)

今、array_values()は、数値配列をうまく再インデクスしますが、配列からすべてのキー文字列を削除し、数値で置き換えます。 キー名(文字列)を保持する必要がある場合、またはすべてのキーが数値である場合に配列を再インデックスするには、array_merge()を使用します。

$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);

出力

Array
(
    [0] => blue
    [1] => green
    [2] => green
    [3] => orange
    [4] => indigo
)

$key = array_search($needle,$array);
if($key!==false){
    unset($array[$key]);
}

<?php
    $stack = array("fruit1", "fruit2", "fruit3", "fruit4");
    $fruit = array_shift($stack);
    print_r($stack);

    echo $fruit;
?>

出力:

Array
(
    [0] => fruit2
    [1] => fruit3
    [2] => fruit4
)

fruit1

<?php 
//If you want to remove a particular array element use this method
$my_array = array("key1"=>"value 1","key2"=>"value 2","key3"=>"value 3");

print_r($my_array);
if(array_key_exists("key1",$my_array)){  
unset($my_array['key1']);
print_r($my_array);
}else{
echo "Key does not exist";
}
?>

<?php 
//To remove first array element
$my_array = array("key1"=>"value 1","key2"=>"value 2","key3"=>"value 3");
print_r($my_array);
$new_array=array_slice($my_array,1); 
print_r($new_array);
?>


<?php 
echo "<br/> ";
//To remove first array element to length
//starts from first and remove two element 
$my_array = array("key1"=>"value 1","key2"=>"value 2","key3"=>"value 3");
print_r($my_array);
$new_array=array_slice($my_array,1,2); 
print_r($new_array);
?>

出力

 Array ( [key1] => value 1 [key2] => value 2 [key3] => 
 value 3 ) Array (    [key2] => value 2 [key3] => value 3 ) 
 Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 ) 
 Array ( [key2] => value 2 [key3] => value 3 )
 Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 ) 
 Array ( [key2] => value 2 [key3] => value 3 ) 

// Remove by value
function removeFromArr($arr, $val)
{
    unset($arr[array_search($val, $arr)]);
    return array_values($arr);
}




arrays