foreach ($array)
がもはやその要素を含まないように、PHP
を使って配列から要素を削除する簡単な方法はありますか?
私はそれをnull
に設定することでそれができると思いましたが、どうやらそれはうまくいきません。
配列要素を削除する方法はいくつかありますが、特定のタスクにとっては他のものよりも便利なものがあります。
1つの配列要素だけを削除したい場合は、 \unset()
または \array_splice()
を使用できます。
また、値があり、要素を削除するためのキーがわからない場合は、 \array_search()
を使用してキーを取得できます。
\unset()
method\unset()
を使用しても、配列キーは変更されず、インデックスの再作成もされません。キーを再インデックス付けしたい場合は、\array_values()
の後に \unset()
を使用できます。これは、すべてのキーを0から始まる数値の列挙キーに変換します。
コード
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
\unset($array[1]);
//↑ Key which you want to delete
?>
出力
[
[0] => a
[2] => c
]
\array_splice()
method\array_splice()
を使用すると、キーは自動的に再インデックス付けされますが、連想キーは、すべてのキーを数字キーに変換する\array_values()
とは異なります。
\array_splice()
もキーではなくオフセットが必要です。 2番目のパラメータとして。
コード
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
\array_splice($array, 1, 1);
//↑ Offset which you want to delete
?>
出力
[
[0] => a
[1] => c
]
array_splice()
と同じ\unset()
は参照によって配列を取ります。これはそれらの関数の戻り値を配列に代入したくないことを意味します。
複数の配列要素を削除し、\unset()
または\array_splice()
を複数回呼び出したくない場合は、削除する要素の値またはキーがわかっているかどうかに応じて、関数\array_diff()
または\array_diff_key()
を使用できます。
\array_diff()
methodあなたが削除したい配列要素の値を知っているなら、あなたは\array_diff()
を使うことができます。 \unset()
の場合と同様に、配列のキーの変更やインデックスの再作成は行われません。
コード
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff($array, ["a", "c"]);
//└────────┘→ Array values which you want to delete
?>
出力
[
[1] => b
]
\array_diff_key()
methodあなたが削除したい要素のキーを知っているなら、あなたは\array_diff_key()
を使いたいです。ここでは、キーを値としてではなく、2番目のパラメータのキーとして渡す必要があります。そうでなければ、 \array_flip()
で配列を反転する必要があります。また、ここでもキーは変更されず、インデックスの再作成もされません。
コード
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
//↑ ↑ Array keys which you want to delete
?>
出力
[
[1] => b
]
また、同じ値を持つ複数の要素を削除するために\unset()
または\array_splice()
を使用したい場合は、 \array_keys()
を使用して特定の値のすべてのキーを取得してから、すべての要素を削除できます。
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()
を使用できます。別のオプションは array_values()
の後に unset()
を使うことです:
$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)
} */
// 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]);
}
unset($array[$index]);
すべての値が一意である(またはそれらが一意ではないが特定の値のすべてのインスタンスを削除する)数値添字配列を使用している場合は、次のように単に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
この例では、初期配列のサイズが4、削除後のサイズが3であることを報告するsizeof()呼び出しで確認できるように、値 'Charles'を持つ要素が削除されます。
また、名前付き要素の場合:
unset($array["elementName"]);
配列の単一要素を破壊する
unset()
$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);
出力は次のようになります。
array(4) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[3]=>
string(1) "D"
[4]=>
string(1) "E"
}
あなたが配列を再インデックスする必要があるならば:
$array1 = array_values($array1);
var_dump($array1);
出力は次のようになります。
array(4) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[2]=>
string(1) "D"
[3]=>
string(1) "E"
}
要素を配列の末尾からポップします - 削除された要素の値を返します
mixed array_pop(array &$array)
$stack = array("orange", "banana", "Apple", "raspberry");
$last_fruit = array_pop($stack);
print_r($stack);
print_r('Last Fruit:'.$last_fruit); // Last element of the array
出力は次のようになります。
Array
(
[0] => orange
[1] => banana
[2] => Apple
)
Last Fruit: raspberry
配列から最初の要素(赤)を削除する 、 - 削除した要素の値を返す
mixed array_shift ( array &$array )
$color = array("a" => "red", "b" => "green" , "c" => "blue");
$first_color = array_shift($color);
print_r ($color);
print_r ('First Color: '.$first_color);
出力は次のようになります。
Array
(
[b] => green
[c] => blue
)
First Color: red
<?php
$stack = array("fruit1", "fruit2", "fruit3", "fruit4");
$fruit = array_shift($stack);
print_r($stack);
echo $fruit;
?>
出力:
Array
(
[0] => fruit2
[1] => fruit3
[2] => fruit4
)
fruit1
検索をしないようにするためにはarray_diff
で遊ぶことができます:
$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11
この場合、キーを検索/使用する必要はありません。
unset()
は指定された変数を破棄します。
関数内のunset()
の動作は、破壊しようとしている変数の種類によって異なります。
グローバル化された変数が関数内でunset()
の場合、ローカル変数のみが破棄されます。呼び出し環境の変数は、unset()
が呼び出される前と同じ値を保持します。
<?php
function destroy_foo()
{
global $foo;
unset($foo);
}
$foo = 'bar';
destroy_foo();
echo $foo;
?>
上記のコードの答えは bar になります。
関数内でグローバル変数をunset()
するには:
<?php
function foo()
{
unset($GLOBALS['bar']);
}
$bar = "something";
foo();
?>
配列内の複数の値を削除する必要があり、その配列内のエントリがオブジェクトまたは構造化データの場合は、[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']]
連想配列の場合は、 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)
// Remove by value
function removeFromArr($arr, $val)
{
unset($arr[array_search($val, $arr)]);
return array_values($arr);
}
連想配列から複数の要素を削除する必要がある場合は、 array_diff_key() (ここでは 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 = 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);
次のような配列があるとします。
Array
(
[user_id] => 193
[storage] => 5
)
storage
を削除するには、次のようにします。
unset($attributes['storage']);
$attributes = array_filter($attributes);
そしてあなたが得る:
Array
(
[user_id] => 193
)
可変属性を持つ特定のオブジェクトがあるとします(基本的にはテーブルをマッピングしていて、テーブル内の列を変更していたので、テーブルを反映するオブジェクト内の属性も変わります)。
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
の全体的な目的は、コードが変更されたときにコード内のあらゆる場所を調べる必要がないことです。クラスの先頭を見て、属性のリストと $ fields 配列を変更するだけです。新しい属性を反映するためのコンテンツ。
解決策:
unset($array[3]); unset($array['foo']);
unset($array[3], $array[5]); unset($array['foo'], $array['bar']);
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.
を言います
数字を扱っているのであれば、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 a new element
$animals[ ] = 'gnu'; // Add a 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() を使用します。
$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() を使用します。
unset()
はここで何度か言及されていますが、unset()
は複数の変数を受け入れて、1回の操作で配列から連続していない複数の要素を簡単に削除できることをまだ言及していません。
// Delete multiple, noncontiguous elements from an array
$array = [ 'foo', 'bar', 'baz', 'quz' ];
unset( $array[2], $array[3] );
print_r($array);
// Output: [ 'foo', 'bar' ]
unset()は削除するキーの配列を受け付けないため、以下のコードは失敗します(ただし、動的にunset()を使用する方が少し簡単になります)。
$array = range(0,5);
$remove = [1,2];
$array = unset( $remove ); // FAILS: "unexpected 'unset'"
print_r($array);
代わりに、unset()をforeachループで動的に使用できます。
$array = range(0,5);
$remove = [1,2];
foreach ($remove as $k=>$v) {
unset($array[$v]);
}
print_r($array);
// Output: [ 0, 3, 4, 5 ]
まだ言及されていない別の方法もあります。時々、特定の配列キーを取り除く最も簡単な方法は、単に$ array1を$ array2にコピーすることです。
$array1 = range(1,10);
foreach ($array1 as $v) {
// Remove all even integers from the array
if( $v % 2 ) {
$array2[] = $v;
}
}
print_r($array2);
// Output: [ 1, 3, 5, 7, 9 ];
明らかに、テキスト文字列にも同じ方法が適用されます。
$array1 = [ 'foo', '_bar', 'baz' ];
foreach ($array1 as $v) {
// Remove all strings beginning with underscore
if( strpos($v,'_')===false ) {
$array2[] = $v;
}
}
print_r($array2);
// Output: [ 'foo', 'baz' ]
以下のように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
)
*/
次のコードを使用してください。
$arr = array('orange', 'banana', 'Apple', 'raspberry');
$result = array_pop($arr);
print_r($result);
<?php
$array = array("your array");
$array = array_diff($array, ["element you want to delete"]);
?>
変数$array
にあなたの配列を作成し、それから私が '削除したい要素'を置いたところにあなたは次のようなものを入れます:複数のアイテムを削除する場合は、「a」、「b」のようにします。
<?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 )
非整数キーを持つ連想配列の場合
単にunset($array[$key])
が機能するでしょう。
整数キーを持つ配列の場合、そしてキーを管理したい場合は、
$array = [ 'mango', 'red', 'orange', 'grapes'];
unset($array[2]);
$array = array_values($array);
array_splice($array, 2, 1);
インデックスの順序を保ちながら配列の最初の項目を削除する方法と、最初の項目のキー名がわからない場合の2つの方法.
// 1 is the index of the first object to get
// NULL to get everything until the end
// true to preserve keys
$array = array_slice($array, 1, null, true);
// Rewinds the array's internal pointer to the first element
// and returns the value of the first array element.
$value = reset($array);
// Returns the index element of the current array position
$key = key($array);
unset($array[$key]);
このサンプルデータの場合:
$array = array(10 => "a", 20 => "b", 30 => "c");
あなたはこの結果を得なければなりません:
array(2) {
[20]=>
string(1) "b"
[30]=>
string(1) "c"
}
キーを取得し、見つかった場合はunsetで削除するには、array_searchを使用します。
if (($key = array_search('Word', $array)) !== false) {
unset($array[$key]);
}
$x = array(1, 2, 3, 4, 5);
var_dump($x);
unset($x[3]); // Here is the key to be deleted
echo '<br>';
array_values($x);
var_dump($x);
これは役立つかもしれません...
<?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 )
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 )
あなたがインデックスを知っているならば:
$arr = ['a', 'b', 'c'];
$index = 0;
unset($arr[$index]); // result: $arr = ['b', 'c']
インデックスがわからない場合は、最初に値を検索する必要があります。
$arr = ['a', 'b', 'c'];
$index = array_search('a',$arr);
unset($arr[$index]); // result: $arr = ['b', 'c']
そのオブジェクトの参照によって配列の特定のオブジェクトを削除する場合は、次の操作を実行できます。
unset($array[array_search($object,$array)]);
例:
<?php
class Foo
{
public $id;
public $name;
}
$foo1 = new Foo();
$foo1->id = 1;
$foo1->name = 'Name1';
$foo2 = new Foo();
$foo2->id = 2;
$foo2->name = 'Name2';
$foo3 = new Foo();
$foo3->id = 3;
$foo3->name = 'Name3';
$array = array($foo1,$foo2,$foo3);
unset($array[array_search($foo2,$array)]);
echo '<pre>';
var_dump($array);
echo '</pre>';
?>
結果:
array(2) {
[0]=>
object(Foo)#1 (2) {
["id"]=>
int(1)
["name"]=>
string(5) "Name1"
}
[2]=>
object(Foo)#3 (2) {
["id"]=>
int(3)
["name"]=>
string(5) "Name3"
}
}
オブジェクトが複数回出現する場合、最初の出現のみが削除されることに注意してください!
foreach
を使って、参照で変数の内容を修正することができます。
<?php
// Remove all elements in the array
foreach ($array as &$arr) {
$arr = null;
}
$arrayName = array( '1' => 'somevalue',
'2' => 'somevalue1',
'3' => 'somevalue3',
);
print_r($arrayName[1]);
// somevalue
unset($arrayName[1]);
print_r($arrayName);
このタスクを実行する方法は2つあります。 unset() および array_splice()
2つの配列を仮定しましょう:
$array_1 = array('a'=>'One', 'b'=>'Two', 'c'=>'Three');
$array_2 = array('Red', 'Yellow', 'White', 'Black', 'Green');
unset()付き
syntax - unset(array_element)
unset($array_1['a']); // Any valid key
unset($array_2[0]); // Any valid index
array_splice()で
syntax - array_splice(array, index, length)
array_splice($array_1, 1, 1); // Remove one element from $array_1 from index 1
array_splice($array_2, 3, 1); // Remove one element from $array_2 from index 3
単純にunset()
を使って配列を削除することができます。
foreach
関数の後で配列を設定解除しなければならないことを忘れないでください。