从数组中删除与字符串匹配的值-php

时间:2019-11-19 11:30:34

标签: php arrays

我有一个如下所示的数组:

staff : staff,company
managers : managers,staff,company
executives : executives,staff,company
customers : customers,company
loyalty members : loyalty members,customers,company
non loyalty : non loyalty,customers,company

该数组由以下命令组成:

array_push($group_array, "$group : $area"); 

此数组是根据命令的输出创建的,我想删除职员和客户的值,因为出于我的目的,他们基本上是父母,所以我不希望它们出现在我的数组中。

我一直在尝试找到一种基本上可以做到这一点的方法(不是我的实际php cod)e:

if array_value contains ",group," then remove it

要尝试执行此操作,我一直在尝试使用strpos,但我无法弄清楚如何比较数组值的各个区域。 这只删除了我数组中的所有项目:

if (strpos($area, ",$group,") !== false) {
    $group_array = array_diff($group_array, group_array(",$group,"));
 }

此外,我的数组并不总是与上面的数组完全匹配,但它始终遵循相同的布局,例如组:组,父母,父母

如果我在页面底部运行此代码,则我在html页面中使用php:


foreach($group_array as $items ){
    echo "$items <br>";
} 

我的输出为空白。我猜是因为我的if是否符合所有条件?

期望的(希望为)数组看起来像这样,但是它并不像删除项目0和3那样简单,因为数组可能会改变:


managers : managers,staff,company
executives : executives,staff,company

loyalty members : loyalty members,customers,company
non loyalty : non loyalty,customers,company

我知道我的措辞还不够好,我希望收到大量的虐待和反对意见,但我会尽力解释我的任务和目标。

1 个答案:

答案 0 :(得分:1)

这是执行此操作的一种方法。使用array_reduce和使用preg_match_all提取逗号之间提到的所有组名:

$groups = array_reduce($group_array, function ($c, $v) { 
    preg_match_all('/,(\w+),/', $v, $matches);
    return array_merge($c, $matches[1]);
}, array());

由于可能存在重复项,我们将此数组传递给array_unique,然后创建一个正则表达式以匹配每个值:

$regex = '/^(' . implode('|', array_unique($groups)) . ')\s*:/';

然后使用array_filter处理$group_array中的每个值,删除:左边的值在$groups数组中的值:

$group_array = array_filter($group_array, function ($v) use ($groups) {
    return !preg_match($regex, $v);
});

输出:

Array
(
    [1] => managers : managers,staff,company
    [2] => executives : executives,staff,company
    [4] => loyalty members : loyalty members,customers,company
    [5] => non loyalty : non loyalty,customers,company
)

Demo on 3v4l.org