PHP:从数组中删除一个元素



Answers

应该注意的是, 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() 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)
} */
Question

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

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




如果你有一个数值索引的数组,其中所有的值都是唯一的(或者它们是非唯一的,但你希望删除特定值的所有实例),你可以简单地使用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。




$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);




当从PHP中的数组中删除元素时,使用的一个好函数是未设置函数。 这是一个用法的例子:

$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" }



<?php
$array = array("your array");
$array = array_diff($array, ["element you want to delete"]);
?>

在变量$ array中创建你的数组,然后在其中放置'你想要删除的元素'的地方放上类似“a”的东西。 如果你想删除多个,那么:“a”,“b”。




销毁数组中的单个元素

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



解决方案:

  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()和将“'” 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;

如果你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()

$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()




遵循默认功能

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);



如果您必须删除数组中的多个值,并且该数组中的条目是对象或结构化数据,则[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功能:

$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()

$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)



为了避免搜索,可以使用array_diff来玩游戏:

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

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




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



假设你有这样一个数组:

Array
(
    [user_id] => 193
    [storage] => 5
)

要删除storage ,请执行:

unset($attributes['storage']);
$attributes = array_filter($attributes);

你会得到:

Array
(
    [user_id] => 193
)



这里用foreach和unset删除的更简单的方法。

$array=[1,2,4,7,5,6];
$elementToDelete = 4;
foreach ($array as $key=>$value)
       {
           if($value == $elementToDelete)unset($array[$key]);
       }
print($array);

结果:阵列([0] => 1 [1] => 2 [2] => 7 [3] => 5 [4] => 6)元素4被移除。




Links



Tags

php php   arrays