【问题标题】:Need a php script diagnosis for a small snippet of code需要对一小段代码进行 php 脚本诊断
【发布时间】:2009-03-14 17:23:00
【问题描述】:

有人能告诉我我做错了什么吗?我要疯了,以下代码在 localhost/WIN 上完美运行,当我在 webhost/linux 上尝试时,它会发出警告:

$lines = file('english.php');
foreach($lines as $line) {
    $matches=array();
    if (preg_match('/DEFINE\(\'(.*?)\',\s*\'(.*)\'\);/i', $line, $matches)) {
        $keys[] = $matches[1];
        $values[] = $matches[2];
    }
}
$lang = array_combine($keys, $values);

当我在虚拟主机上测试时:

Warning: array_combine() expects parameter 1 to be array, null given in /home/xx/public_html/xx on line 616

但在本地服务器(windows xp)上它运行完美。我不知道我做错了什么,请帮我解决这个噩梦:(

谢谢。

【问题讨论】:

    标签: php regex arrays


    【解决方案1】:

    我没有看到您的代码有任何明显错误,但我很好奇您为什么要构建单独的数组然后将它们组合起来,而不是仅仅构建一个组合数组:

    // Make sure this file is local to the system the script is running on.
    // If it's a "url://" path, you can run into url_fopen problems.
    $lines = file('english.php');
    
    // No need to reinitialize each time.
    $matches = array();
    
    $lang = array();
    foreach($lines as $line) {
        if (preg_match('/DEFINE\(\'([^\']*)\',\s*\'([^\\\\\']*(?:\\.[^\\\\\']*)*)\'\);/i', $line, $matches)) {
            $lang[$matches[1]] = $matches[2];
        }
    }
    

    (我还更改了您的正则表达式以处理单引号。)

    【讨论】:

    • 你是老板!问题出在文件本身..我也按照您的指示更正了我的代码
    【解决方案2】:

    php版本是一样的吗?

    您确定您已将所有文件传输到虚拟主机吗?

    【讨论】:

    • array_combine() 仅在 PHP 5 中可用。如果服务器有 PHP 4,则会显示“函数不存在”错误,而不是“array_combine() 期望参数 1 为数组”
    【解决方案3】:

    您的 $keys 变量似乎为空,因为您没有在任何地方对其进行初始化。

    我最好的猜测是您服务器上的 english.php 文件是空的(或不存在),所以当您尝试读取它时,$keys 变量中没有保存任何内容;

    尝试在 foreach 语句之前为该变量添加一个初始值:

    $lines = file('english.php');
    $keys = array();
    foreach($lines as $line) {
    $matches=array();
        if (preg_match('/DEFINE\(\'(.*?)\',\s*\'(.*)\'\);/i', $line, $matches)) {
            $keys[] = $matches[1];
            $values[] = $matches[2];
        }
    }
    $lang = array_combine($keys, $values);
    

    这样,即使文件不存在或为空,您也可以覆盖所有可能的路径。

    您应该始终像一切都可能出错一样进行编码,而不是相反:)

    【讨论】:

    • 谢谢。该文件存在并包含 89 行数据,当我在 localhost 上测试时,结果也会打印到浏览器中。这就是我感到困惑的原因。因为它在本地主机上没有问题,但在网络主机上没有问题.. :)
    • 更新:我添加了 $keys = array();和 $values = array();在 $lines 以下,它仍然可以在 localhost 上完美运行(它会打印结果),但在 Web 主机上它改变了错误:警告:array_combine() [function.array-combine]:两个参数都应该在 /home/ 中至少有 1 个元素...
    • 它说它们是空数组,但事实并非如此,该文件包含 89 行,本地主机可以读取它们全部.. 困惑:)
    • 嗯.. 棘手的一个。本地主机与服务器上的english.php 文件完全相同吗?在本地和服务器上打开文件后尝试创建一个 var_dump($lines) 。也许一些奇怪的路径设置让你相信你得到的是同一个文件,而实际上你不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多