unset数组 - php数组删除某个值




PHP:从数组中删除元素 (20)

有没有一种简单的方法可以使用PHP从数组中删除元素,这样foreach ($array)不再包含该元素?

我认为将它设置为null会这样做,但显然它不起作用。


unset不会改变索引但是array_splice会改变索引

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

unset($anArray[0]);

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

unset()数组中的多个碎片元素

虽然这里已经多次提到了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()不接受要删除的键数组,因此下面的代码将失败(这会使得稍微更容易动态地使用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()销毁指定的变量。

unset()在函数内部的行为可能会有所不同,具体取决于您尝试销毁的变量类型。

如果全局化变量在函数内部未unset() ,则仅销毁局部变量。 调用环境中的变量将保留与调用unset()之前相同的值。

<?php
function destroy_foo() 
{
    global $foo;
    unset($foo);
}

$foo = 'bar';
destroy_foo();
echo $foo;
?>

上面代码的答案将是

unset()函数内的全局变量

<?php
function foo() 
{
    unset($GLOBALS['bar']);
}

$bar = "something";
foo();
?>

根据键删除数组元素:

使用如下的未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
)

*/

销毁数组的单个元素

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

为了避免进行搜索,可以使用array_diff

$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11

在这种情况下,不必搜索/使用密钥。


删除数组元素有不同的方法,其中一些对某些特定任务比其他任务更有用。

删除一个数组元素

如果只想删除一个数组元素,可以使用unset()或替代array_splice()

此外,如果您有值并且不知道删除元素的键,则可以使用array_search()来获取密钥。

unset()方法

请注意,使用unset() ,数组键不会更改/ reindex。 如果要重新索引键,可以在unset()之后使用array_values() unset() ,它将所有键转换为从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_splice()需要偏移量,而不是键! 作为第二个参数。

<?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()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() 。 在这里,您必须确保将键作为键传递到第二个参数而不是值。 否则,您必须使用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()获取特定值的所有键,然后删除所有元素。


如果你有一个数字索引数组,其中所有值都是唯一的(或者它们是非唯一的,但你希望删除特定值的所有实例),你可以简单地使用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”的元素,因为可以通过sizeof()调用验证,该调用报告初始数组的大小为4,删除后的大小为3。


如果需要从关联数组中删除多个元素,可以使用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($array[$key])会起作用。

对于具有整数键的数组,如果要维护键:

  1. $array = [ 'mango', 'red', 'orange', 'grapes'];

unset($array[2]); $array = array_values($array);

  1. array_splice($array, 2, 1);

您只需使用unset()删除数组即可。

请记住,在foreach函数之后必须取消设置数组。


我只想说我有一个特定的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的整个目的就是这样我在代码更改时无需查看代码,我只看一下类的开头并更改属性列表和$ fields数组内容以反映新属性。

我花了一点时间想出这个。 希望这可以帮助别人。


此外,对于命名元素:

unset($array["elementName"]);

这可能有帮助......

<?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(2) { [1]=> string(1) "Y" [2]=> string(1) "Z" }


  // 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