见:
$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
答案 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基础知识的工作方式存在误解。如果您提出另一个解释您要做的事情的问题,那将是最好的,以确定这样做的好方法。
让我们一步一个步骤:
explode
的数组,从而生成一个数组数组。您可以使用array_map
或简单foreach
。array_merge
或array_merge_recursive
执行此操作(详细信息会有所不同,理念相同)。array_filter
过滤掉不感兴趣的元素。array_values
的连续数字键。这是执行此操作的代码,虽然稍有不同(我使用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);