PHP:按预先确定的 CSV 顺序格式化变量...但是为什么此代码作为函数会中断?

PHP: Format variable by predetermined CSV order... but Why this code as function breaks?

此代码完美运行...但为什么我将其用作 PHP 函数时出错?

$name = '1 value';
$age  = '2 value';
$date = '3 value';

$string = "date, name, age"; //default CSV file Column order

会得到很好的结果:

date, name, age

date|name|age
3 value|1 value|2 value|

通过使用此代码:

echo $string.'<br/>'; 

echo implode("|", explode(", ", $string)).'<br/><br/>';

    $line='';
    foreach(explode(", ", $string) as $str)    {
            $line .= $$str.'|';
    }
    echo $line;

我编写这个函数:

<?php
function toImplode($string)
{
    $line = '';
    foreach (explode(", ", $string) as $str) {
        $line .= $$str . '|';
    }
    return $line;
}

echo 'Variable to line formatted order is:<br/> ' . toImplode($string) . '<br/>';

但是我得到了这个错误:

> Notice: Undefined variable: name in on line 22 
> Notice: Undefined variable: age in on line 22 
> Notice: Undefined variable: date in on line 22

我不明白为什么。

通过调试器 运行,我相信我已经找到了问题所在 - 如果您所指的错误是 datename 的未定义变量错误和 age,这是由于 scoping - 在 PHP 函数中,该函数内的代码无法查看或访问在该函数外部设置的变量,除非您将它们定义为 global,或将它们作为参数传递给函数。

您可以通过在函数中使用 global 关键字来执行此操作 - 即,要使变量 $name$date$age 可访问,您d 添加此行:global $name, $date, $age;。在您的脚本上下文中,global $$str; 在技术上是有效的并且 运行 也是如此,尽管我不确定这是否是最佳实践。

如果您指的是 Array to string conversion 通知,这是由您的 echo explode(...) 行引起的 - explode() returns 一个数组,无法转换回一个字符串。您可能想尝试 print_r() or var_dump() 而不是输出数组内容。

您可以使用 global keyword with variable variables ($$):

在函数体中添加以下行

global $$str; 

所以完整代码变为:

<?php

$name = '1 value';
$age  = '2 value';
$date = '3 value';
$string = "date, name, age";

function toImplode($string) { $line=''; foreach(explode(", ", $string) as $str){ global $$str; $line .= $$str.'|';} return $line;} 

echo 'Variable to line formatted order is: '.toImplode($string).'<br/>';

输出:

Variable to line formatted order is: 3 value|1 value|2 value|<br/>

Try it online!