我正在写一个脚本,它似乎有点ballache,所以我来到so请求一点帮助,使我的脚本更动态,所以我创建一个更好的版本,我正在做什么。我已经阅读了变量变量,但我仍然停留在如何使用它们。
我显然会把它缩短一些但是我现在的脚本是:
$a0 = $tags['items'][0]['snippet']['tags'];
$a1 = $tags['items'][1]['snippet']['tags'];
$a2 = $tags['items'][2]['snippet']['tags'];
if (!is_array($a0)) { $a0 = array(); }
if (!is_array($a1)) { $a1 = array(); }
if (!is_array($a2)) { $a2 = array(); }
$a0 = array_map('strtolower', $a0);
$a1 = array_map('strtolower', $a1);
$a2 = array_map('strtolower', $a2);
array_count_values(array_merge($a0,$a1,$a2));
我正在寻找一种方法来动态地创建变量(例如,在while循环中使用索引,而不是唯一地创建这些变量。这在小范围内显然是没问题的,但我目前已经为每个人做了50次,这导致了严重的时间问题。如有任何帮助,不胜感激
将整个$tags变量视为数组,您可以这样做,类似于您已经使用的strtolower array_map:
$tagItems = [];
foreach($tags['items'] as $item) {
if (!$item['snippet']['tags'] || !is_array($item['snippet']['tags'])) {
continue;
}
foreach($item['snippet']['tags'] as $tag) {
$tag = strtolower($tag);
if (!isset($tagItems[$tag])) {
$tagItems[$tag] = 0;
}
$tagItems[$tag]++;
}
}
正如@FranzGleichmann所说,尽量不要使用可变变量,这是一种气味和潜在的安全风险,而是重新考虑如何解决问题。
您应该能够使用嵌套的foreach
循环产生与array_count_values
相同的输出。
foreach ($tags['items'] as $x) { // loop over the list of items
foreach ($x['snippet']['tags'] as $tag) { // loop over the tags from each item
$tag = strtolower($tag);
if (!isset($counts[$tag])) $counts[$tag] = 0;
$counts[$tag]++; // increment the tag count
}
}
无需创建100个变量。那会引起头痛的。相反,使用一个简单的循环函数。
$b = array();
for ($n=1; $n<=100; $n++) {
$a = $tags['items']["$n"]['snippet']['tags'];
if (!is_array($a)) { $a = array(); }
$a = array_map('strtolower', $a);
array_count_values(array_merge($b,$a));
}
我希望它能工作!有一个漂亮的编码
我会在评论中写这篇文章,但我会写一篇很长的评论。变量变量,简单地说就是原始var
作为变量名赋值的值,它的意思是:
$my_1st_var = 'im_1st';
//use $$
$$my_1st_var = 'im_2nd'; //that is the same of $im_1st='im_2nd';
//results
echo $my_1st_var; // >>> im_1st
echo $im_1st; // >>> im_2nd
这意味着我创建了一个新的var
,并将其命名为第一个var
的值,即im_1st
,这使得变量名称为$im_1st
也可以设置多个值作为一个变量名:
$var0 = 'a';
$var1 = 'b';
$var2 = 'c';
$var3 = '3';
//we can do this
${$var0.$var1} = 'new var 1'; //same as: $ab = 'new var 1';
${$var1.$var2.$var3} = 'im the newest'; //same as: $bc3 = 'im the newest';
//set a var value + text
${$var0.'4'.$var1} = 'new?'; //same as: $a4b = 'new?';
$GOLBALS[];
也是某种$$
希望它能帮助你理解$$
的难点;)
动态创建变量对于PHP这样的脚本语言来说很容易。
你可以让$a
成为一个数组,而不是$a0
, $a1
,…当$i
从0到50或更多时,使用$a[$i]
。
或者您可以使用这个漂亮的时髦语法:${'a'.$i}
。例如:
$i = 0;
${'a'.$i} = 'foobar';
echo $a0; // will output foobar
但是你不应该这样做。
你应该做的是考虑一下你想要达到的目标,然后想出一个不需要动态命名变量的不同算法。
在这种情况下,像这样的代码看起来可以完成工作:
$result = [];
foreach ( $tags['items'] as $item ) {
if ( is_array($item['snippet']['tags']) ) {
$result = array_merge($result, array_map('strtolower',$item));
}
}
array_count_values($result);
这显然是没有经过测试,从我的头的顶部,但我希望你得到的想法。(编辑:或者用类似的重写算法检查其他答案)