在其他变量名称中使用变量 - PHP

时间:2012-11-14 11:10:33

标签: php

见:

        $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行我得到了PHP解析错误“unset($ results_array_。< strong> $ k [$ key])“,为什么会发生这种情况?

我感谢任何帮助


为什么我这样做:

我有一个名为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的每个索引中,最后result_array应该是:

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

1 个答案:

答案 0 :(得分:2)

回答原始问题

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

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. 执行此操作
  3. 将数组数组“展平”为一个大数组。您可以使用array_mergearray_merge_recursive执行此操作(详细信息会有所不同,理念相同)。
  4. 搜索展平的数组,并使用array_filter过滤掉不感兴趣的元素。
  5. 如有必要,重新索引已过滤的数组,使其具有array_values的连续数字键。
  6. 这是执行此操作的代码,虽然稍有不同(我使用array_reduce在第一行同时执行步骤1和2):

    $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);