2013-02-28 57 views
2

是否可以搜索数组键?搜索数组中的键的一部分 - PHP

比方说,我有以下数组:

$array = array('array_one' => 'a', 'array_two' => 'b', 'three' => 'c'); 

我只想得到这个数组:

$array = array('array_one' => 'a', 'array_two' => 'b'); 

所以我想获取其包含字符串值的每个关键密钥中的'array_'。

谢谢!

+1

恐怕你必须用foreach循环,寻找键值。 – Ghigo 2013-02-28 15:27:38

+0

'preg_grep()'可能会有所帮助,但是当您构建数组时,您可能会更好地重构数组,以使其更适合您的使用方式。 – SDC 2013-02-28 15:34:52

回答

3

您可以使用按键array_filter然后相交:

$validKeys = array_filter(array_keys($array), 
    function($key) { 
     return substr($key, 0, 6) === 'array_'; 
    } 
); 

$array = array_intersect_key($array, array_flip($validKeys)); 
+0

谢谢!完美的解决方案 – 2013-02-28 15:39:30

+2

不是非常高效......只是为了创建一个新的按键阵列(不需要),加上交叉点而在原始阵列上循环(不需要)... – gremo 2013-02-28 15:45:58

+0

@Gremo:你说的对,*应该*性能在这里成为一个问题(大数组),一个foreach会改进它。 – 2013-02-28 15:51:59

1

我想一个foreach循环:

$search='_array'; 
foreach ($array as $k => $v) { 

    if (strpos($a, $search)!==false) echo "$search is in $k!<br />"; 

} 
3

要过滤静态您可以使用array_intersect_key

$allowed = array('foo', 'bar'); 
$filtered = array_intersect_key($array, array_flip($allowed)); 

你的情况,我认为你需要循环:

$filtered = array(); 

foreach($array as $key => $val) { 
    if(false !== strpos($key, 'array_')) { 
     $filtered[$key] = $val; 
    } 
} 
3

您可以使用负过滤器来代替:

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

Demo

注意它修改就地数组。

更新

或者,因为5.6现在可以使用array_filter

$array = array_filter($array, function($value, $key) { 
    return strpos($key, 'array_') === 0; 
}, ARRAY_FILTER_USE_BOTH);