foreach ($array)
가 더 이상 해당 요소를 포함하지 않도록 PHP를 사용하여 배열에서 요소를 삭제하는 쉬운 방법이 있습니까?
null
설정하면 할 것이라고 생각했지만 분명히 작동하지 않습니다.
질문자 :Ben
foreach ($array)
가 더 이상 해당 요소를 포함하지 않도록 PHP를 사용하여 배열에서 요소를 삭제하는 쉬운 방법이 있습니까?
null
설정하면 할 것이라고 생각했지만 분명히 작동하지 않습니다.
배열 요소를 삭제하는 방법에는 여러 가지가 있으며, 일부는 다른 것보다 특정 작업에 더 유용합니다.
하나의 배열 요소만 삭제하려면 unset()
또는 \array_splice()
사용할 수 있습니다.
값을 알고 요소를 삭제할 키를 모르는 경우 \array_search()
를 사용하여 키를 얻을 수 있습니다. \array_search
는 첫 번째 히트만 반환하기 때문에 요소가 두 번 이상 발생하지 않는 경우에만 작동합니다.
unset()
unset()
을 사용할 때 배열 키는 변경되지 않습니다. 키를 다시 인덱싱하려면 unset()
다음에 \array_values()
사용할 수 있습니다. 그러면 모든 키가 0부터 시작하는 숫자로 열거된 키로 변환됩니다.
암호:
$array = [0 => "a", 1 => "b", 2 => "c"]; unset($array[1]); // ↑ Key which you want to delete
산출:
[ [0] => a [2] => c ]
\array_splice()
메서드 \array_splice()
를 사용하면 키가 자동으로 다시 인덱싱되지만 모든 키를 숫자 키로 변환하는 \array_values()
\array_splice()
는 두 번째 매개변수로 키가 아닌 오프셋이 필요합니다.
암호:
$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()
메서드 삭제하려는 배열 요소의 값을 알고 있다면 \array_diff()
사용할 수 있습니다. unset()
이전과 마찬가지로 배열의 키를 변경하지 않습니다.
암호:
$array = [0 => "a", 1 => "b", 2 => "c", 3 => "c"]; $array = \array_diff($array, ["a", "c"]); // └────────┘ // Array values which you want to delete
산출:
[ [1] => b ]
\array_diff_key()
메서드 삭제하려는 요소의 키를 알고 있다면 \array_diff_key()
를 사용하고 싶습니다. 두 번째 매개변수에서 값이 아닌 키로 키를 전달해야 합니다. 키는 색인을 다시 생성하지 않습니다.
암호:
$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()
또 다른 옵션은 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) } */
// 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
이 예제에서 값이 'Charles'인 요소는 초기 배열에 대해 4 크기를 보고하고 제거 후에 3을 보고하는 sizeof() 호출로 확인할 수 있으므로 제거됩니다.
또한 명명된 요소의 경우:
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 = ["fruit1", "fruit2", "fruit3", "fruit4"]; $fruit = array_shift($stack); print_r($stack); echo $fruit; ?>
산출:
[ [0] => fruit2 [1] => fruit3 [2] => fruit4 ] fruit1
인덱스가 지정된 경우:
$arr = ['a', 'b', 'c']; $index = 0; unset($arr[$index]); // $arr = ['b', 'c']
인덱스 대신 값이 있는 경우:
$arr = ['a', 'b', 'c']; // search the value to find index // Notice! this will only find the first occurrence of value $index = array_search('a', $arr); if($index !== false){ unset($arr[$index]); // $arr = ['b', 'c'] }
index
가 발견되지 않으면 unset()
이 우리가 원하지 않는 배열의 첫 번째 요소를 자동으로 삭제 if
조건이 필요합니다.
배열에서 여러 값을 삭제해야 하고 해당 배열의 항목이 객체 또는 구조화된 데이터인 경우 array_filter()
가 가장 좋습니다. 콜백 함수에서 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']]
연관 배열에서 여러 요소를 제거해야 하는 경우 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 )
연관 배열의 경우 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)
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(); ?>
// Remove by value function removeFromArr($arr, $val) { unset($arr[array_search($val, $arr)]); return array_values($arr); }
솔루션:
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,
말하고 두 번째는 This still exists, but its value is the empty string.
숫자를 다루는 경우 0을 할당하는 것이 더 나은 대안이 될 수 있습니다. 따라서 회사가 모델 XL1000 스프로킷의 생산을 중단하면 다음으로 재고를 업데이트합니다.
unset($products['XL1000']);
그러나 일시적으로 XL1000 스프로킷이 소진되었지만 이번 주 후반에 공장에서 새 배송물을 받을 계획이라면 다음이 더 좋습니다.
$products['XL1000'] = 0;
요소를 설정 해제() 하면 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()
은 지정된 변수를 파괴합니다. 자세한 내용은 PHP 설정 해제를 참조하세요.
$Array = array("test1", "test2", "test3", "test3"); unset($Array[2]);
array_pop()
함수는 배열의 마지막 요소를 삭제합니다. 자세한 내용은 PHP array_pop을 참조하십시오.
$Array = array("test1", "test2", "test3", "test3"); array_pop($Array);
array_splice()
함수는 배열에서 선택한 요소를 제거하고 새 요소로 대체합니다. 자세한 내용은 PHP array_splice를 참조하십시오.
$Array = array("test1", "test2", "test3", "test3"); array_splice($Array,1,2);
array_shift()
함수는 배열에서 첫 번째 요소를 제거합니다. 자세한 내용은 PHP array_shift를 참조하십시오.
$Array = array("test1", "test2", "test3", "test3"); array_shift($Array);
변수 속성이 있는 특정 개체가 있다고 말하고 싶습니다(기본적으로 테이블을 매핑하고 테이블의 열을 변경하므로 테이블을 반영하는 개체의 속성도 달라질 수 있음).
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 배열 내용을 반영하여 변경합니다. 새로운 속성.
다음 배열이 있다고 가정합니다.
Array ( [user_id] => 193 [storage] => 5 )
storage
를 삭제하려면 다음을 수행하십시오.
unset($attributes['storage']); $attributes = array_filter($attributes);
그리고 당신은 다음을 얻습니다:
Array ( [user_id] => 193 )
인덱스 순서를 유지하면서 배열의 첫 번째 항목을 제거하는 두 가지 방법과 첫 번째 항목의 키 이름을 모르는 경우.
// 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()
여기 여러번 언급 한 내용은 그것이 아직 언급한다 unset()
여러 변수가 삭제 여러 번 작업의 배열에서 인접 요소 진정을 받아 :
// 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);
대신 foreach 루프에서 unset()을 동적으로 사용할 수 있습니다.
$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 // 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 )
객체가 해당 배열에 있는 것으로 간주할 수 없는 경우 검사를 추가해야 합니다.
if(in_array($object,$array)) unset($array[array_search($object,$array)]);
해당 객체를 참조하여 배열의 특정 객체를 제거하려면 다음을 수행할 수 있습니다.
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" } }
개체가 여러 번 발생하면 첫 번째 항목만 제거됩니다.
unset($arr[$i])를 사용하는 것보다 이 문제에 대한 더 우아한 해결책이 있는지 확인하고 싶었기 때문에 여기에 왔습니다. 실망스럽게도 이러한 답변은 잘못되었거나 모든 극단적인 경우를 다루지 않습니다.
array_diff()가 작동하지 않는 이유는 다음과 같습니다. 키는 배열에서 고유하지만 요소가 항상 고유하지는 않습니다.
$arr = [1,2,2,3]; foreach($arr as $i => $n){ $b = array_diff($arr,[$n]); echo "\n".json_encode($b); }
결과...
[2,2,3] [1,3] [1,2,2]
두 요소가 같으면 제거됩니다. 이는 array_search() 및 array_flip()에도 적용됩니다.
array_slice() 및 array_splice()에 대한 많은 답변을 보았지만 이러한 함수는 숫자 배열에서만 작동합니다. 여기에서 질문에 대답하지 않는 경우 내가 알고 있는 모든 답변이 있으므로 여기에 작동할 솔루션이 있습니다.
$arr = [1,2,3]; foreach($arr as $i => $n){ $b = array_merge(array_slice($arr,0,$i),array_slice($arr,$i+1)); echo "\n".json_encode($b); } Results... [2,3]; [1,3]; [1,2];
unset($arr[$i]) 은 연관 배열과 숫자 배열 모두에서 작동하므로 여전히 질문에 답하지 않습니다.
이 솔루션은 숫자 배열과 연관 배열을 모두 처리하는 도구와 키를 비교하는 것입니다. 이를 위해 array_diff_uassoc()을 사용합니다. 이 함수는 콜백 함수의 키를 비교합니다.
$arr = [1,2,2,3]; //$arr = ['a'=>'z','b'=>'y','c'=>'x','d'=>'w']; foreach($arr as $key => $n){ $b = array_diff_uassoc($arr, [$key=>$n], function($a,$b) { if($a != $b){ return 1; } }); echo "\n".json_encode($b); }
결과.....
[2,2,3]; [1,2,3]; [1,2,2]; ['b'=>'y','c'=>'x','d'=>'w']; ['a'=>'z','c'=>'x','d'=>'w']; ['a'=>'z','b'=>'y','d'=>'w']; ['a'=>'z','b'=>'y','c'=>'x'];
출처 : http:www.stackoverflow.com/questions/369602/deleting-an-element-from-an-array-in-php
Maven을 사용하여 종속성이 있는 실행 가능한 JAR을 어떻게 만들 수 있습니까? (0) | 2021.11.10 |
---|---|
설치된 PowerShell 버전 확인 (0) | 2021.11.10 |
"B"를 인쇄하는 것이 "#"을 인쇄하는 것보다 훨씬 느린 이유는 무엇입니까? (0) | 2021.11.10 |
Git은 rebase에서 관련 없는 기록 병합을 거부합니다. (0) | 2021.11.09 |
MySQL에서 datetime 또는 timestamp 데이터 유형을 사용해야 합니까? (0) | 2021.11.09 |