6

新手问题 - 我正在尝试使用以“not__”开头的键删除元素。它在 laravel 项目中,所以我(可以)使用它的数组函数。我试图在循环后删除元素。这不会删除任何东西,即它不起作用:

function fixinput($arrinput)
{
    $keystoremove = array();
    foreach ($arrinput as $key => $value);
    {
        if (starts_with($key, 'not__'))
        {
            $keystoremove = array_add($keystoremove, '', $key);
        }
    }
    $arrinput = array_except($arrinput, $keystoremove);
    return $arrinput;
}

请注意,这不是阵列上的唯一任务。我会自己试试。:)

谢谢!

4

4 回答 4

5
$filtered = array();

foreach ($array as $key => $value) {
    if (strpos($key, 'not__') !== 0) {
        $filtered[$key] = $value;
    }
}
于 2013-07-03T10:38:51.077 回答
5

使用带有标志的array_filter函数ARRAY_FILTER_USE_KEY看起来是最好/最快的选择。

$arrinput = array_filter( $arrinput, function($key){
    return strpos($key, 'not__') !== 0;
}, ARRAY_FILTER_USE_KEY );

标志参数直到版本 5.6.0 才添加,因此对于旧版本的 PHP,for 循环可能是最快的选择。

foreach ($arrinput as $key => $value) {
    if(strpos($key, 'not__') === 0) {
        unset($arrinput[$key]);
    }
}

我会假设以下方法要慢得多,但它只是一种不同的方法。

$allowed_keys = array_filter( array_keys( $arrinput ), function($key){
    return strpos($key, 'not__') !== 0;
} );
$arrinput = array_intersect_key($arrinput , array_flip( $allowed_keys ));

功能

if(!function_exists('array_remove_keys_beginning_with')){

    function array_remove_keys_beginning_with( $array,  $str ) {

        if(defined('ARRAY_FILTER_USE_KEY')){
            return array_filter( $array, function($key) use ($str) {
                return strpos($key, $str) !== 0;
            }, ARRAY_FILTER_USE_KEY );
        }
        foreach ($array as $key => $value) {

            if(strpos($key, $str) === 0) {
                unset($array[ $key ]);
            }
        }
        return $array;
    }
}
于 2015-12-07T11:28:48.967 回答
0

一些 PHP 正则表达式 fu:

$array = array('not__foo' => 'some_data', 'bar' => 'some_data', 12 => 'some_data', 15 => 'some_data', 'not__taz' => 'some_data', 'hello' => 'some_data', 'not__world' => 'some_data', 'yeah' => 'some_data'); // Some data

$keys = array_keys($array); // Get the keys
$filter = preg_grep('#^not__#', $keys); // Get the keys starting with not__
$output = array_diff_key($array, array_flip($filter)); // Filter it
print_r($output); // Output

输出

Array
(
    [bar] => some_data
    [12] => some_data
    [15] => some_data
    [hello] => some_data
    [yeah] => some_data
)
于 2013-07-03T10:40:52.307 回答
-1

尝试这个...

function fixinput($arrinput)
{
    $keystoremove = array();
    foreach ($arrinput as $key => $value);
    {
        if (preg_match("@^not__@",$key))
        {
            $keystoremove = array_add($keystoremove, '', $key);
        }
    }
    $arrinput = array_except($arrinput, $keystoremove);
    return $arrinput;
}
于 2013-07-03T10:38:56.453 回答