【问题标题】:PHP "remove from array where" operationPHP“从数组中删除”操作
【发布时间】:2013-11-21 01:31:35
【问题描述】:

假设您有一个 php 数组,其中包含名字和姓氏的字典/关联数组,如下所示:

$userList = array(array('first'=>'Jim', 'last'=>'Kirk'), array('first'=>'George', 'last'=>'Bush'));
/*
$userList now looks like
{
    {
        first => Jim,
        last => Kirk
    },
    {
        first => George,
        last => Bush
    }
}
*/

我如何告诉 php 给"Remove elements from $userList as $users where $user['first'] === 'George'"

【问题讨论】:

  • 我在回答中做了一个函数removeByWhere,你可以尝试使用。

标签: php arrays


【解决方案1】:

array_filter 与带有所需条件的回调一起使用

【讨论】:

  • 这是我认为正确答案的简短版本,谢谢马特。
【解决方案2】:

foreach 并使用引用 & 能够修改/取消设置该数组元素:

foreach($userList as &$user) {
    if($user['first'] == 'George') {
        unset($user);
    }
}

【讨论】:

  • 我不认为 OP 想要删除名字,而是整个用户。
  • 有趣。所以,你只是在数组中“取消设置”变量,而不告诉数组,这样就可以工作并且不会导致崩溃?
  • 这很常见,也是他们添加对foreach 的引用的原因。刚刚看到你的答案(哇),不能说我会构建一个 function 来返回一个 closure 并通过array_filter 运行它。实际上,我可以说,我不会。
【解决方案3】:

我是这样做的(基于 This Question 的“Charles”的回答)...

首先,我创建了一个函数工厂:

function createNotNamedFunction($first)
{
    return function($user) use($first) { 
        return $user['first'] !== $first;
    };
}

然后,当我需要过滤数组时调用它:

$first = 'George';
$notNamed = self::createNotNamedFunction($first);
$filteredUsers = array_filter($userList, $notNamed);

简短简单易懂可扩展(测试可以任意复杂,因为它是一流的功能)和不涉及循环

此技术使用 闭包array_filter,并且仅适用于 PHP 5.3 或更高版本,但这是我认为的规范答案。事实证明,当您提供任意测试时,array_filter “从数组中删除”。

感谢所有贡献替代模式的世界级 php 向导!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2011-06-11
    • 2013-01-02
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多