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