PHP - 从以某个字符串开头的数组中获取所有键

Ale*_*lex 73 php arrays array-filter

我有一个看起来像这样的数组:

array(
  'abc' => 0,
  'foo-bcd' => 1,
  'foo-def' => 1,
  'foo-xyz' => 0,
  // ...
)
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到开头的元素foo-

eri*_*sco 119

功能方法:

array_filter_keyhttp://php.net/array_filter中的评论中选择一种函数或编写自己的函数.然后你可以这样做:

$array = array_filter_key($array, function($key) {
    return strpos($key, 'foo-') === 0;
});
Run Code Online (Sandbox Code Playgroud)

程序方法:

$only_foo = array();
foreach ($array as $key => $value) {
    if (strpos($key, 'foo-') === 0) {
        $only_foo[$key] = $value;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用对象的程序方法:

$i = new ArrayIterator($array);
$only_foo = array();
while ($i->valid()) {
    if (strpos($i->key(), 'foo-') === 0) {
        $only_foo[$i->key()] = $i->current();
    }
    $i->next();
}
Run Code Online (Sandbox Code Playgroud)

  • 注意PHP 5.6将ARRAY_FILTER_USE_KEY标志添加到`array_filter()`,您可以使用它而不是提供自定义`array_filter_key()`函数. (17认同)
  • 您能否将 array_filter_key 函数添加到您的示例中?我不断收到错误消息,不得不多次重读您的帖子,然后才认识到我的错误。发布代码、保存点击并节省一些时间进行故障排除并不难。谢谢。 (5认同)

小智 37

我就是这样做的,虽然在理解你想要对你得到的值做什么之前,我不能给你一个更有效的建议.

$search = "foo-";
$search_length = strlen($search);
foreach ($array as $key => $value) {
    if (substr($key, 0, $search_length) == $search) {
        ...use the $value...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用:`foreach($ array as $ key => $ value){if(0 === strpos($ key,'foo-')){...使用$ value ...}}` (2认同)

小智 17

$arr_main_array = array('foo-test' => 123, 'other-test' => 456, 'foo-result' => 789);

foreach($arr_main_array as $key => $value){
    $exp_key = explode('-', $key);
    if($exp_key[0] == 'foo'){
         $arr_result[] = $value;
    }
}

if(isset($arr_result)){
    print_r($arr_result);
}
Run Code Online (Sandbox Code Playgroud)

  • 在您采用此解决方案之前,下面的解决方案更好.永远不要使用简单字符串函数就足够的数组函数.字符串函数更快.这将与大型阵列"滞后". (16认同)
  • 我没有看到将数组键爆炸成数组的重点.它们是字符串,原始问题只是询问字符串前缀.OP也要求"元素"而不仅仅是值,因此数字索引的结果将是无用的 - 键在这里显然很重要,值(大概)是匿名的1/0标志. (2认同)

biz*_*lop 17

从PHP 5.3,你可以使用preg_filter的功能:在这里

$unprefixed_keys = preg_filter('/^foo-(.*)/', '$1', array_keys( $arr ));

// Result:
// $unprefixed_keys === array('bcd','def','xyz')
Run Code Online (Sandbox Code Playgroud)


Tim*_*per 14

foreach($arr as $key => $value)
{
   if(preg_match('/^foo-/', $key))
   {
        // You can access $value or create a new array based off these values
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,正则表达式并不是必需的.substr方法稍微有效 (3认同)
  • @jfoucher:这是真的,但是,就个人而言,它更容易阅读. (2认同)
  • 它可能更灵活,但如果您*不想*进行正则表达式匹配,则需要转换特殊preg字符.所以要谨慎使用.我建议你只在需要RE时才使用RE. (2认同)

Sur*_*amy 12

我只是使用array_filter函数来实现解决方案,如下所示

<?php

$input = array(
    'abc' => 0,
    'foo-bcd' => 1,
    'foo-def' => 1,
    'foo-xyz' => 0,
);

$filtered = array_filter($input, function ($key) {
    return strpos($key, 'foo-') === 0;
}, ARRAY_FILTER_USE_KEY);

print_r($filtered);
Run Code Online (Sandbox Code Playgroud)

产量

Array
(
    [foo-bcd] => 1
    [foo-def] => 1
    [foo-xyz] => 0
)
Run Code Online (Sandbox Code Playgroud)

如需实时查看https://3v4l.org/lJCse


Key*_*r K 7

erisco功能方法的修改,

array_filter($signatureData[0]["foo-"], function($k) {
    return strpos($k, 'foo-abc') === 0;
}, ARRAY_FILTER_USE_KEY);
Run Code Online (Sandbox Code Playgroud)

这对我有用.