我有一个PHP数组如下:

$messages = [312, 401, 1599, 3, ...];

我想删除包含值$del_val的元素(例如,$del_val=401),但我不知道它的键。这可能会有帮助:每个值只能在那里出现一次。

我正在寻找执行这项任务的最简单的函数。


当前回答

借用了underscore.JS _的逻辑。拒绝并创建了两个函数(人们更喜欢函数!!)

array_reject_value:该函数简单地拒绝指定的值(也适用于PHP4,5,7)

function array_reject_value(array &$arrayToFilter, $deleteValue) {
    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if ($value !== $deleteValue) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

array_reject:这个函数只是拒绝可调用方法(适用于PHP >=5.3)

function array_reject(array &$arrayToFilter, callable $rejectCallback) {

    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if (!$rejectCallback($value, $key)) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

所以在我们当前的例子中,我们可以像下面这样使用上述函数:

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401);

或者甚至更好:(因为这给了我们更好的语法使用,比如array_filter)

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
    return $value === 401;
});

上面的代码可以用于更复杂的事情,比如我们想要删除所有大于或等于401的值,我们可以简单地这样做:

$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
    return $value >= $greaterOrEqualThan;
});

其他回答

接受的答案将数组转换为关联数组,因此,如果您希望将其作为与接受的答案的非关联数组,您可能也必须使用array_values。

if(($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
    $arr = array_values($messages);
}

参考资料在这里

借用了underscore.JS _的逻辑。拒绝并创建了两个函数(人们更喜欢函数!!)

array_reject_value:该函数简单地拒绝指定的值(也适用于PHP4,5,7)

function array_reject_value(array &$arrayToFilter, $deleteValue) {
    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if ($value !== $deleteValue) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

array_reject:这个函数只是拒绝可调用方法(适用于PHP >=5.3)

function array_reject(array &$arrayToFilter, callable $rejectCallback) {

    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if (!$rejectCallback($value, $key)) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

所以在我们当前的例子中,我们可以像下面这样使用上述函数:

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401);

或者甚至更好:(因为这给了我们更好的语法使用,比如array_filter)

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
    return $value === 401;
});

上面的代码可以用于更复杂的事情,比如我们想要删除所有大于或等于401的值,我们可以简单地这样做:

$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
    return $value >= $greaterOrEqualThan;
});

最好的方法是array_splice

array_splice($array, array_search(58, $array ), 1);

最佳理由请访问http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/

function array_remove_by_value($array, $value)
{
    return array_values(array_diff($array, array($value)));
}

$array = array(312, 401, 1599, 3);

$newarray = array_remove_by_value($array, 401);

print_r($newarray);

输出

Array ([0] => 312 [1] => 1599 [2] => 3)

根据您的要求“每个值只能出现一次”,如果您只是想在数组中保持唯一的值,那么array_unique()可能就是您正在寻找的。

输入:

$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);

结果:

array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}