2014-02-04 2 views
0

У меня есть ассоциативный массив PHP, и я хотел бы сгенерировать список ключей, которые проходят определенный тест. Например,PHP Array Filter на KEYS, которые проходят определенный тест

$myArray = ('28'=>0.01,'51'=>-0.1,'48'=>0.4,'53'=>-0.3); 

И я хотел бы отфильтровать клавиши так же, как я могу просто фильтровать значения. Так что, если я фильтровать значения на «возвращают элементы, которые больше, чем 0,2» будет

print_r(array_filter($myArray,"biggerThanFilter"); 

с

function biggerThanFilter($v){ 
     return $v>0.2; 
} 

Но как бы я применить фильтр к ключам, которые говорят, что «keyValueIsBiggerThan50 "

т.е. что-то вроде этого

print_r(array_KEY_filter($myArray,"keyValueIsBiggerThan50"); 

function keyValueIsBiggerThan50($key){ 
     return $key*1>50; 
} 
+0

Вы должны получить только ключи, без значений? – hindmost

+1

Дубликат: http://stackoverflow.com/questions/4260086/php-how-to-use-array-filter-to-filter-array-keys – sigy

+0

@sigy - да Я вижу (+1) и +1 для человек, который ответил на это. Но мой вопрос яснее - вопрос в этом посте больше подходит для сопоставления, а не для прохождения теста. – nickL

ответ

2

Я бы перебрать array_keys и снята с охраны, лично:

function array_filter_keys($array, callable $fn) 
    foreach (array_keys($array) as $key) { 
    if (!$fn($key)) unset($array[$key]) 
    } 
    return $array; 
} 

$filtered_array = array_filter_keys($array, function($key) { return $key > 50 }); 

Это предполагает PHP> = 5,4

+0

Спасибо - вызываемый - это то, что я искал, как могу затем используйте функцию с похожим синтаксисом для функций byValue. Спасибо. – nickL

1
function keyValueIsBiggerThan50 ($myArray) { 
    $newArray = array(); 
    foreach($myArray as $key => $value){ 
     if($key * 1 > 50){ 
      $newArray[$key] = $value 
     } 
    } 

    return $newArray; 
} 

использоваться как

print_r(keyValueIsBiggerThan50 ($myArray)); 

Вы ищете для этого конкретного случая, или общий?

+0

Это было нечто более общее с обратным вызовом, которым я был, но мне нравится ваш ответ, и я едва успел купить кофе, прежде чем вы отправили ... – nickL

0

Для PHP 5.6+ my answer to a similar question также относится к этому: использовать ARRAY_FILTER_USE_KEY

<?php 
$myArray = ['28' => 0.01, '51' => -0.1, '48' => 0.4, '53' => -0.3]; 
$filtered = array_filter(
    $myArray, 
    function ($key) { 
     return $key > 50; 
    }, 
    ARRAY_FILTER_USE_KEY 
); 
?> 
0

Для PHP < 5.6, array_diff_ukey выполняет выборочное сравнение двух массивов по ключу и, как представляется, выполняет полное сравнение N x M, поэтому вы можете фильтровать одиночный массив, используя манекен в качестве второго массива.

Использование PHP 5.5.9, я использовал следующее для удаления цифровых ключевых элементов из массива:

$res = array_diff_ukey($res, array(0), function ($a,$b){ return is_string($a); });