2013-02-28 2 views
2

Можно ли искать ключи массива?Поиск части ключа в массиве - PHP

Скажем, у меня есть следующий массив:

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

И я просто хочу, чтобы получить этот массив:

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

Так что я хочу, чтобы принести каждый ключ с его значением, содержащим строку 'array_' в ключ.

Спасибо!

+1

Я боюсь, что вы должны цикла с Еогеасп и искать ключевые ценности. – Ghigo

+0

'preg_grep()' может помочь, но вам, вероятно, будет лучше перестроить массив, когда вы его построите, чтобы сделать его более удобным для использования, как вы хотите его использовать. – SDC

ответ

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

Спасибо! Идеальное решение –

+2

Не очень эффективный ... цикл над исходным массивом (не нужен) только для создания нового массива ключей (не требуется), плюс пересечение ... – gremo

+0

@Gremo: вы правы, * должны * производительность здесь возникает проблема (большие массивы), один сингл улучшит его. –

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

Обратите внимание, что он изменяет массив на месте.

Update

Или, так как 5.6 теперь вы можете использовать array_filter:

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