2015-10-29 4 views
0

У меня есть двумерный массив массива с однородными значениями.php конвертировать строку в условные операторы

$input = array(
    'x' => 100, 'y' => 101, 'type' => 'yes', value => 10 
), array(
    'x' => 110, 'y' => 101, 'type' => 'no', value => 10 
), array(
    'x' => 120, 'y' => 102, 'type' => 'yes', value => 99 
); 

мне нужно найти способ, чтобы написать функцию, чтобы фильтровать значения, проходящие в «текст» фильтр в качестве входных данных:

//extract all values when $tye = yes and $value is greater than 10 
custom_filter($input, "type = yes and value > 10"); 

//extract all values when $x is equal to $y 
custom_filter($input, "x = y"); 

//filter all values for x is pair and y is odd 
custom_filter($input, "x % 2 = 0 and y % 2 > 0"); 

function custom_filter($input_array, $condition) { 
    (...) 
} 

Есть ли способ, чтобы «перевести «параметр параметра $ из считываемого человеком оператора в условный оператор php?

+0

Это можно сделать с помощью 'eval()', но было бы очень сложно учесть все возможные команды. – miken32

+0

Практически нет возможности разметки ваших заполнителей как переменных PHP, потому что 'y'cannot легко изменить на' $ y', потому что это изменило бы также 'type' на' t $ ype' и 'yes' to' $ yes '. – syck

ответ

0

Я думаю, что это самый простой способ:

$input = [ 
    ['x' => 100, 'y' => 101, 'type' => 'yes', 'value' => 10], 
    ['x' => 110, 'y' => 101, 'type' => 'no', 'value' => 10], 
    ['x' => 120, 'y' => 102, 'type' => 'yes', 'value' => 99] 
]; 

function custom_filter($array, $eval) { 
    $validate = function ($item) use($eval) { 
     extract($item); 
     eval('$valid = ' . $eval . ';'); 

     return $valid; 
    }; 

    return array_filter($array, $validate); 
} 

//extract all values when $tye = yes and $value is greater than 10 
var_dump(custom_filter($input, '$type == "yes" && $value > 10')); 

//extract all values when $x is equal to $y 
var_dump(custom_filter($input, '$x == $y')); 

//filter all values for x is pair and y is odd 
var_dump(custom_filter($input, '$x % 2 == 0 && $y % 2 > 0')); 

Ну, вы должны написать код PHP в качестве условия для извлеченных значений.

+0

Предупреждение: 'eval()' - это дьявол, и вы не должны позволять вводить данные, находящиеся рядом с ним. – Sammitch

Смежные вопросы