0

我是 PHP 新手。我想根据 for 循环条件值生成变量名称。这是我的代码。

  <?php
    for ( $i = 1; $i < $totalcolumns; $i++ ) 
{
  $pattern1 .= '\$'.'a'.$i'';
}
$pattern = str_repeat ('%d', $totalcolumns);

根据上面的代码,我已经定义了 $pattern 来根据 totalcolumns 的值生成 %d。$pattern 部分在下面的循环中非常好。

while (fscanf ($file,'\''.$pattern.'\'','\''.$pattern1.'\''))

因此,例如,如果我的 totalcolumns 值为 3,则上述 while 循环应按如下方式展开。

while (fscanf ($file,'%d%d%d',$a1,$a2,$a3))

该模式正在正确扩展,我使用 echo 语句进行了检查。但是,如果我包含用于生成 pattern1 的代码,我的程序不会产生任何输出。

我正在尝试使用变量 pattern1 生成模式 $a1、$a2、$a3。我正在使用 PHP 的字符串连接,但我无法在屏幕上看到任何输出。有人可以指导我正确的方向吗?

4

2 回答 2

2

可以试试这个:

<?php
// You probably might have code here to populate $totalcolumns .
// For test purpose I assumed a value .
    $totalcolumns = 3;

//  Initialize $pattern1
    $pattern1 = '';
//  Make sure weather you need $i < $totalcolumns or $i <= $totalcolumns
    for ( $i = 1; $i < $totalcolumns; $i++ ) 
    {
    //  Your line was $pattern1 .= '\$'.'a'.$i''; which has systax error due to two single quotes before the semicolon
        $pattern1 .= '\$'.'a'.$i;
    }
    echo $pattern1;

将输出:

\$a1\$a2

以上回答了您的(实际)问题。但似乎您需要调用具有可变参数数量的函数。如果是这种情况,call_user_func_array可以在以下方面为您提供帮助:

call_user_func_array
可变变量
如何将可变数量的参数传递给 PHP 函数

<?php
// You probably might have code here to populate $totalcolumns .
// For test purpose I assumed a value .
    $totalcolumns = 3;

//  Also assuming some values for $a1, $a2, $a3 etc.
    $a1 = 'abc';
    $a2 = 'pqr';
    $a3 = 'xyz';

//  For test purpose I used a string replace it with the actual file handle
    $file = 'File handle';

//  Initialize $pattern
    $pattern = '';

//  Define an array to hold parameters for call_user_func_array
    $parameterArray = array();

//  Put first parameter of fscanf at index 0 of $parameterArray
    $parameterArray[0] = $file;

//  Initialize second parameter of fscanf at index 1 of $parameterArray
    $parameterArray[1] = $pattern;

    $parameterArrayIndex = 2;
    for ( $i = 0; $i < $totalcolumns; $i++ ) 
    {
        $pattern .= '%d';
        $parameterArray[$parameterArrayIndex] = ${"a".($i+1)};  // Variable variables
        $parameterArrayIndex++;
    }

//  Update second parameter of fscanf at index 1 of $parameterArray
    $parameterArray[1] = $pattern;

    var_dump( $parameterArray );

    while( call_user_func_array( 'fscanf', $parameterArray ) )
    {
        //  Do what ever you need to do here
    }
于 2013-10-02T00:25:11.710 回答
0
<?php
$totalcolumns = 3
for ( $i = 1; $i <= $totalcolumns; $i++ ){
    $pattern1 .= '$a' . $i . ', ';
}
//remove the last comma and space.
$pattern1 = rtrim($pattern1, ", ");
echo $pattern1;
//$a1, $a2, $a3

完全基于:“我正在尝试生成模式 $a1, $a2, $a3”

我很确定您也不必在单引号中转义美元($)符号。

"\$"

'$'

然后,如果我想对输出做点什么

<?php
$filledInString = str_replace('$a1', "REPLACED!", $pattern1);
$filledInString = str_replace('$a3', "AGAIN!", $filledInString);
echo $filledInString;
//REPLACED!, $a2, AGAIN!
?>

或者您可能只是在寻找可变变量,但也许这就是您所追求的。不知道,希望它有所帮助:-)

于 2013-10-03T22:02:32.413 回答