【问题标题】:Filter array keys starting with certain characters [duplicate]过滤以某些字符开头的数组键[重复]
【发布时间】:2017-08-03 06:46:07
【问题描述】:

我有数组:

$persons = [
   'name_1' => 'asfddf',
   'name_2' => 'gsdg',
   'name_3' => '23423',
   'name_aaa' => '123sdg',
   'test' => '123sdg',
   'other' => '123sdg',
   'name_5' => 'sdg2334',
];

如何从这个数组中获取键值为name的值?

在我的示例中,我希望收到:

$persons = [
   'name_1' => 'asfddf',
   'name_2' => 'gsdg',
   'name_3' => '23423',
   'name_aaa' => '123sdg',
   'name_5' => 'sdg2334',
];

我可以使用foreach 并通过strpos 检查密钥,但这可能是更好的方法吗?任何地图减少?

【问题讨论】:

  • foreach 是最简单、最易读的方式。你为什么要把事情复杂化?
  • 你可以使用 array_filterARRAY_FILTER_USE_KEY 以及一个回调,如果你愿意,但最终它与使用 foreach 迭代数组相同。
  • @xander 但请注意 array_filter 从 php5.6 开始在回调中使用 keys,因此它不适用于旧版本。

标签: php arrays


【解决方案1】:

PHP 5.6 及更高版本的解决方案:

您可以将array_filterARRAY_FILTER_USE_KEY 标志一起使用:

$array = array_filter($persons, function($key) {
    return strpos($key, 'name') === 0;
}, ARRAY_FILTER_USE_KEY);

print_r($array);

旧版本的解决方案:

这使用 key 进行比较,然后使用 array_intersect_key 应用 key 交集

$array = array_filter(array_keys($persons), function($key) {
    return strpos($key, 'name') === 0;
});

print_r(array_intersect_key($persons, array_flip($array)));

打印:

Array
(
    [name_1] => asfddf
    [name_2] => gsdg
    [name_3] => 23423
    [name_aaa] => 123sdg
    [name_5] => sdg2334
)

【讨论】:

  • 请注意 第三个 参数是在 php5.6 中添加的。
  • @u_mulder 也添加了替代解决方案!
【解决方案2】:

你可以试试substr

foreach($persons as $key => $value){
    if("name_" == substr($key,0,5)){
    // process the value
     }
 }

或者你可以简单地使用preg_match来做到这一点

foreach($persons as $key => $value){
    if (preg_match('/name_/',$key)) {
        echo $value;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-29
    • 2020-03-08
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2015-05-16
    • 2020-09-13
    • 2011-03-26
    相关资源
    最近更新 更多