PHP -停止需要创建数百个变量


PHP - Stop need to create hundreds of variables

我正在写一个脚本,它似乎有点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);

这显然是没有经过测试,从我的头的顶部,但我希望你得到的想法。(编辑:或者用类似的重写算法检查其他答案)