PHP,根据数组的开头删除简单数组中的一些元素';s值

PHP,根据数组的开头删除简单数组中的一些元素';s值,php,Php,我有一个示例数组: $a = [ "foo1", "faa2", "foo3", "fuu4", "faa5", "foo6", ..., "fuuX", ]; 举例来说,我想删除这个数组中以“foo”和“faa”开头的所有元素。预期结果必须是: $removes = [ "foo", "faa" ] // some processes var_dump($a); /* show $a = [ "

我有一个示例数组:

$a = [
    "foo1",
    "faa2",
    "foo3",
    "fuu4",
    "faa5",
    "foo6",
    ...,
    "fuuX",
];
举例来说,我想删除这个数组中以“foo”和“faa”开头的所有元素。预期结果必须是:

$removes = [
    "foo",
    "faa"
]

// some processes 

var_dump($a);
/* show  
$a = [
    "fuu4",
    ...,
    "fuuX",
];
*/
在我的示例中,
$remove
数组包含2个条目。但在我的实际情况中,这个数组可能包含X个条目

如何根据数组值的开头(包含在另一个数组中,
$removes
,在我的示例中,
$removes
)删除主数组中的条目(示例中为
$a

谢谢你的帮助

编辑: 我可以这样做:

foreach($a as $key=>$entry){
    foreach($removes as $remove){
        if(strpos($entry, $remove) === 0){
            unset($a[$key]);
            break:
        }
    }
}

但我认为(也许我错了)有一个更好的解决方案(更合适,php执行时间更快)。也许有一种方法可以避免双重foreach

以下是一些您可以使用的方法。已编辑以在移除数组中循环:


    public function doStuff()
    {
        $haystack = [
            "foo1",
            "faa2",
            "foo3",
            "fuu4",
            "faa5",
            "foo6",
            "fuuX",
        ];

        $removes = [
            "foo",
            "faa"
        ];

        $this->removeFromArrayByPrefixes($removes, $haystack);
    }

    protected function removeFromArrayByPrefixes($prefixes, $haystack)
    {
        $newData = [];
        foreach ($prefixes as $prefix) {
            foreach ($haystack as $key => $value) {
                // Check if that this iteration does not have the prefix
                if (strpos($value, $prefix) === false) {
                    // Prefix not found, add to return data
                    $newData[] = $value;
                }
            }
        }
        return $newData;
    }


在当前代码的基础上展开,可以使用基本for循环遍历这两个数组,并根据需要删除项

$a = [
    "foo1",
    "faa2",
    "foo3",
    "fuu4",
    "faa5",
    "foo6",
    "fuuX",
];


$removes = [
    "foo",
    "faa"
];

// some processes 



foreach($a as $index => $item){

  foreach($removes as $removeItem){

//This is specifically looking for the $removes at the start of the string and not anywhere in the string like strpos would do.
if( mb_substr($item, 0, 3) == $removeItem){
            unset($a[$index]); 
            break;
      }

    }
}

var_dump($a);
这可能对你有帮助

<?php
$a = [
    "foo1",
    "faa2",
    "foo3",
    "fuu4",
    "faa5",
    "foo6",   
    "fuuX",
];
$removes = [
    "foo",
    "faa"
];
$collection = array();
foreach($a as $key => $value){
    foreach($removes as $val){
        if(substr($value, 0, strlen($val)) === $val){
            $collection[] = $value;
            continue 2;
        }
    }
}
print_r($collection);
?>


谢谢。

您可以使用一个简单的foreach来过滤此内容。下面的示例使用自定义函数允许数组作为字符串搜索的指针。该示例使用“foo”和“faa”过滤所有值

$a = [
    "foo1",
    "faa2",
    "foo3",
    "fuu4",
    "faa5",
    "foo6",
    "fuuX",
];

function strposa($haystack, $needle, $offset=0) {
    if (!is_array($needle)) $needle = array($needle);
    foreach($needle as $query) {
        if (strpos($haystack, $query, $offset) !== false)
            return true; // stop on first true result
    }
    return false;
}

$r = [];
foreach($a as $key => $value){
    if(false === strposa($value, ['foo', 'faa'])){
         $r[] = $value;
    }
}

var_dump($r);
结果1。 您可以在此在线测试中看到测试和结果:

2.搜索一个字符串很简单 如果只搜索一个字符串,是否更容易,请参见以下内容:

$a = [
    "foo1",
    "faa2",
    "foo3",
    "fuu4",
    "faa5",
    "foo6",
    "fuuX",
];

$r = [];
foreach($a as $key => $value){
    if(false === strpos($value, 'foo')){
         $r[] = $value;
    }
}

var_dump($r);
结果2。
你的问题与这篇文章有关:到目前为止你做了什么?首先,你做过任何研究吗?我会尽快完成我的帖子。ray_filter可能比手动创建新数组更有效,
function removeFromArrayByPrefix($prefix,$haystack){return array_filter($haystack,function($v)use(&$prefix){return(false!==strop($v,$prefix));});
我已经修改了答案,接受要删除的前缀数组
$a = [
    "foo1",
    "faa2",
    "foo3",
    "fuu4",
    "faa5",
    "foo6",
    "fuuX",
];

$r = [];
foreach($a as $key => $value){
    if(false === strpos($value, 'foo')){
         $r[] = $value;
    }
}

var_dump($r);
array(4) {
  [0]=>
  string(4) "faa2"
  [1]=>
  string(4) "fuu4"
  [2]=>
  string(4) "faa5"
  [3]=>
  string(4) "fuuX"
}