0

看到这个:

        $q = 'blah';
        for($k = 0; $k < count($results_array); $k++){
            $results_array_ . $k = explode(',', $results_array[$k]);
            foreach($results_array_ . $k as $key => $value){
                if (stripos($value, $q) === false) {
                unset($results_array_ . $k[$key]);
                break;
                }
            }
        }

在第 3 行,我只是使用“$results_array_ . $k ”,它工作得很好,但在第 6 行,我在“unset($results_array_ . $k [$key])”上遇到 PHP 解析错误,为什么这发生了?

我感谢任何帮助


为什么我这样做:

我有一个名为 results_array 的数组:

var_dump($results_array):
0 => php,mysql,jquery,ruby,html,css,lamp
1 => mouse,keyboard,laptop,pad
2 => table,sofa,caption

我有一个 $q 代表查询,我想在 $results_array 中搜索并删除与查询无关的项目,所以如果我设置$q=a那么结果数组应该是这样的:

0 => lamp
1 => keyboard,laptop,pad
3 => table,sofa,caption

现在,我想把上面的结果放在results_array的每个索引中,最后results_array应该是:

0 => lamp
1 => keyboard
2 => laptop
3 => pad
4 => table
5 => sofa
6 => caption
4

1 回答 1

2

回答原始问题

unset期望其参数是对值的直接引用,例如$varor $array['key']。如果要根据其他值动态创建参数,则必须使用变量变量语法:

unset(${$results_array_ . $k[$key]});

这将消除警告,但它仍然不会使代码工作,因为它存在根本缺陷。您提到的第 3 行内容如下:

$results_array_ . $k = explode(',', $results_array[$k]);

它所做的是将一个数组分解为$k然后连接$results_array_$k...丢弃结果。你可以很容易地写

$k = explode(',', $results_array[$k]);

并且它的工作方式相同(除非可能不给出不存在的内容)E_NOTICE$_results_array_

因此,您似乎对某些 PHP 基础知识的工作方式存在误解。最好你问另一个问题来解释你正在尝试做什么,以确定什么是做这件事的好方法。

回答当前问题

让我们一步一步来:

  1. 取出字符串数组并将每个字符串转换为一个数组explode,形成一个数组数组。您可以使用array_map或简单的foreach.
  2. 将数组“展平”成一个大数组。array_merge你可以用or来做这个array_merge_recursive(细节会有点不同,想法是一样的)。
  3. 搜索展平的数组并用 过滤掉不感兴趣的元素array_filter
  4. 如有必要,重新索引过滤后的数组,使其具有连续的数字键array_values

这是执行此操作的代码,尽管略有不同(我在第一行同时使用 执行步骤 1 和 2 array_reduce):

$array = (...);
$array = array_reduce($array, function(&$result, $item) {
    return array_merge($result, explode(',', $item));
}, array());
$array = array_filter($array, function($item) use ($string) { 
    return strpos($item, $string) !== false;
});
$result = array_values($array);

一个不使用花哨功能的版本:

// Step 1
foreach($array as &$row) {
    $row = explode(',', $row);
}
unset($row);

// Step 2
$array = call_user_func_array('array_merge_recursive', $array);

// Step 3
foreach ($array as $k => $v) {
    if(strpos($v, 'a') === false) unset($array[$k]);
}

// Step 4
$array = array_values($array);
于 2012-11-14T11:14:48.633 回答