foreach循环外的未定义变量

时间:2014-09-12 02:22:47

标签: php loops

我编写的代码可以抓取谷歌字体并将它们添加为HTML正文类。代码工作正常,但在我的IDE中,我收到一个未定义的变量消息。我可以看到为什么变量在foreach循环之外。

 $fontstring = implode(' ', $families);
    foreach ($families as $fontstring) {
      $font = preg_replace('#[^a-zA-Z0-9]+#', '-', $fontstring);
    $vars['classes_array'][] = strtolower($font);
    }

对于上面的代码,循环前的$fontstring似乎未定义。

此代码从Google的api中获取字符串并删除字符以使其成为相当的字符串。

<body class="Pathway+Gothic+One:regular">

变为:

<body class="pathway-gothic-one-regular">

然后我可以在我的Sass代码中使用它来进行精细调整,例如

.pathway-gothic-one-regular {
@include headings(uppercase, .02em, 60px, 9px);
// etc...
}

我尝试过像$fontstring = array();这样的事情,但似乎并没有帮助。我还尝试了implode中的foreach函数,但这也没有用。所以我在这里有点亏。

2 个答案:

答案 0 :(得分:1)

鉴于你正在使用PHPStorm,我怀疑你没有事先声明$vars(正确):

foreach ($anArray as $foo)
{
    //PHPStorm (rightfully) complains
    $newVar['array_vals'][] = $foo;
}
return $newVar;//<-- again, PHPStorm will complain, with good reason

由于$newVar未预先声明,因此没有真实的保证$newVar将存在于循环之外:如果$anArray为空,循环不会被执行,并且不会创建$newVar 除此之外,编写$newVar[] = $foo;是不好的做法:您正在访问一个不存在的变量,就像它是一个数组一样。 PHP将为您创建一个数组,但如果它必须访问不存在的数组的键(未定义的索引错误),它将发出通知。如果您的代码中的$vars未在前面声明,则会出现这种情况,因为您正在使用键classes_array访问不存在的变量作为数组。简而言之:初始化$vars数组:

$vars = array(
    'classes_array' => array()
);

那应该修复那些警告/错误。在$fontString上:如果您正在分配变量,PHPStorm也会发出警告,并立即重新分配,您可以这样做:

$fontString = implode(' ', $families);//assigning
foreach ($families as $fontString)
{//re-assigning in the loop!
    //more on the code here later
}

如果您希望PHPStorm为您提供绿灯,那么您必须写下以下内容:

$vars = array('classes_array' => array());//initialize
if ($families)
{
    foreach ($families as $fontString)
    {//a one-liner
        $vars['classes_array'][] = preg_replace(
            '/[^\d\w]+/',//\d == [0-9], \w == [a-z]
            '-',
            strtolower($fontString)//tolower here, so you don't need [A-Z]
        );
    }
}
else
{
    $vars['classes_array'][] = '';//empty string
}

我已将此代码粘贴到PHPStorm中,并且没有任何警告或错误:所有变量都被使用,并且所有变量都应在何时何地初始化。我在PHPStorm中粘贴代码的方式是:

protected function test(array $families = null)
{
    $vars = array(
        'classes_array' => array()
    );
    if ($families)
    {
        foreach ($families as $fontString)
        {
            $vars['classes_array'][] = preg_replace(
                '/[^\d\w]+/',
                '-',
                strtolower($fontString)
            );
        }
    }
    else
    {
        $vars['classes_array'][] = '';
    }
    return $vars;
}

答案 1 :(得分:0)

试试这个......

if(isset($families) && $families != null)
{
    $fontstring = array();
    $fontstring = implode(' ', $families);
    foreach ($families as $fontstring) 
    {
        $font = preg_replace('#[^a-zA-Z0-9]+#', '-', $fontstring);
        $vars['classes_array'][] = strtolower($font);
    }
}