如何返回php字符串的文字值,以便它作为代码运行?

时间:2016-06-30 12:00:27

标签: php arrays string eval array-filter

我不确定我是否正在使用正确的术语,但我会尝试解释,我使用PHP array_filter函数来过滤产品,并回调到我添加过滤器的自定义函数。我可以很容易地进行硬编码,但我显然希望它是动态的:

简而言之,自定义过滤器函数返回到array_filter()函数,如下所示:

return ($arr['colour']=='Red' || $arr['colour']=='White');

如果像上面那样进行硬编码,这样可以正常工作,并按预期过滤数组,只显示红色或白色的产品,但我需要这是动态的。

那么如何构造一个值字符串然后在return语句中使用它呢?

例如:

$var="$arr['colour']=='Red' || $arr['colour']=='White'";
return ($var);

不起作用。我尝试过使用eval()(我不想以任何方式使用它!)并且它仍然无法正常工作。

我有一个循环,如下从数组构造字符串:

// $value=array of filters e.g colour=Black, colour=Red

$filterparts=explode("=",$value);

$filters[]='$arr[\''.$filterparts[0].'\']==\''.$filterparts[1].'\'';
//creates array e.g $arr['colour']='Red'

$imploded_filter= implode(" || ", $uniquefilters);
//creates string e.g $arr['colour']='Red' || $arr['colour']='White'

所以,如果我回显$ imploded_filter,我会得到我想要返回的提取字符串

echo $imploded_filter;
// outputs $arr['colour']='Red' || $arr['colour']='White'

但是,如果我这样做

return($imploded_filter);

它显然没有将字符串作为硬代码进行评估,所以我能做什么,是否需要对字符串执行某些操作或以不同的方式返回它,或构造我需要以完全不同的方式返回的代码?

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

$colors = ['Red', 'White'];
$products = array_filter($products, function ($product) use ($colors) {
    return in_array($product['color'], $colors);
});

几乎没有任何理由或需要“动态创建PHP源代码”。总有一个操作可以在任意数量的元素上执行您想要的操作,而无需连接||运算符。这里in_array是一个非常好的函数来测试一个值对许多人。您可以使用use ($colors)动态传递colors数组。

古老PHP版本的最佳解决方法是使用类近似匿名回调:

class InArrayFilterCallback {

    public $data = array();
    public $key;

    public __construct($data, $key) {
        $this->data = $data;
        $this->key = $key;
    }

    public callback($item) {
        return in_array($item[$this->key], $this->data);
    }

}

$products = array_filter($products, array(new InArrayFilterCallback($colors, 'color'), 'callback'));

当然,您也可以使用简单的foreach循环代替......

答案 1 :(得分:0)

可以动态指定数组键。不需要eval()

$value = $array[$key];

您可以在array_filter()回调中构建过滤器列表并匹配每个过滤器:

$filters = array(
    array('colour', array('white', 'blue')), // multiple accepted values (OR)
    array('material', 'Fine Bone China'), // single accepted value
);

$filtered = array_filter($products, function ($item) use ($filters) {
    // match all filters
    foreach ($filters as $filter) {
        // detect multi-value filter
        $isArrayFilter = is_array($filter[1]);

        if (
            // check if multi-value filter doesn't match
            $isArrayFilter && !in_array($item[$filter[0]], $filter[1])
            // check if a single-value filter doesn't match
            || !$isArrayFilter && $item[$filter[0]] != $filter[1]
        ) {
            // filter doesn't match - exclude the item
            return false;
        }
    }

    // all filters match - include the item
    return true;
});

答案 2 :(得分:0)

为什么不使用in_array函数,如下所示:

$filters = [
    'colour' => [
        'red',
        'blue',
    ]
];
array_filter($list, function ($item) use ($filters) {
    foreach ($filters as $index => $filter) {
        if (!in_array($item[$index], $filter)) {
            return false;
        }
    }
    return true;
});

制作字符串并评估它并不是一个好主意