Php 为什么isset()即使变量存在也无法识别

Php 为什么isset()即使变量存在也无法识别,php,Php,这是我的脚本(其中的一部分,但它涵盖了我想说的内容): 我的问题: 为什么调用的1只出现在输出中,而调用的0不出现在输出中?我的意思是$this->callBack[$columns[$key]]两者都有对吗?我错过了什么 从我所看到的:isset($columns[$key])对于这两个都是TRUE,而isset($this->callBack[$columns[$key]])的第二个条件对于“FacilityID”是FALSE为什么 PS:从我所看到的,所有的索引都被定义了 完整编辑2我的脚

这是我的脚本(其中的一部分,但它涵盖了我想说的内容):

我的问题: 为什么
调用的1
只出现在输出中,而
调用的0
不出现在输出中?我的意思是
$this->callBack[$columns[$key]]
两者都有对吗?我错过了什么

从我所看到的:
isset($columns[$key])
对于这两个都是
TRUE
,而
isset($this->callBack[$columns[$key]])
的第二个条件对于“FacilityID”是FALSE为什么

PS:从我所看到的,所有的索引都被定义了

完整编辑2我的脚本功能:

function parseFile() {
        error_reporting(E_ALL);
        $f=fopen($this->file,"r");
        if($f) {
            $buffer = NULL;
            $columns = array();
            $data = array();
            $firstLine = true;
            while(($buffer = fgets($f,4096)) !== false) {

                if($firstLine) {
                    $columns = explode($this->delimeter,$buffer);
                    foreach ($columns as $key=>$val) {
                        $columns[$key] = trim($val);
                    }
                    $firstLine = false;
                }
                else {
                //not first line
                    $data = explode($this->delimeter,$buffer);
                    var_dump($this->callBack);
                    var_dump($columns);
                    var_dump($data);
                    foreach ($data as $key=>$val) {
                        echo $columns[$key].' ';
                        if(isset($columns[$key]) && isset($this->callBack[$columns[$key]])) {
                            echo "called $key<br/>";
                            call_user_func(array($this,$this->callBack[$columns[$key]]),trim($val));

                        }
                    }
                }
            }
            if(!feof($f)) {
                throw new Exception("Unexpected error. Parsing stopped in middle");
            }
        }
        else {
            throw new Exception("File Not Found");
        }
    }

有一件事我注意到
0=>string'FacilityID'(长度=13)
看起来不对<代码>设备ID的长度仅为10。。。不知道你是怎么结束的,但首先要做的是。。。尝试修剪
$columns
中的值,因为其中一定有一些坏字符。或者尝试找出在执行的其余部分中,值在何处损坏

更新

见此问答


csv是否包含可能会使字符串长度变大的xml/html。另外,请看一下如何使用简化代码。您可能会发现,仅此一项就可以修复代码,因为它将为您清理行和分隔符。

嗯,对我来说很有用。两行都输出

<?php
$callback = array(
  'FacilityID' => 'setFacilityID',
  'FacilityName' => 'setFacilityName'
);
$columns = array(
  0 => 'FacilityID',
  1 => 'FacilityName'
);
$data = array(
  0 => '1',
  1 => '"Business Center"'
);

var_dump($callback);
var_dump($columns);
var_dump($data);

foreach ($data as $key=>$val) {
    if(isset($columns[$key]) && isset($callback[$columns[$key]])) {
        echo "---called $key---<br/>";
        call_user_func(array($this,$callback[$columns[$key]]),trim($val));
    }
}

这是一个非常奇怪的错误。每个人都试图回答这个问题,但是我没能回答,因为我发现错误不在于脚本,而在于我读取的外部文件。该文件位于。如果我以某种方式使用了这3个额外的字符,即使调用了
trim()
,这些字符也没有被修剪,但是它们进入了输入。如果有人能对这件事有更多的了解,那就好了。也许这本身就是一个新问题

但我解决了这个问题,只需将记事本中的内容复制粘贴到另一个文件并保存即可。但这不是一个好方法。如果有人有更好的答案,请张贴


<?php
// Reads past the UTF-8 bom if it is there. 
// Credit for the function: http://www.php.net/manual/en/function.fopen.php#78308
function fopen_utf8 ($filename, $mode) { 
    $file = fopen($filename, $mode); 
    $bom = fread($file, 3); 
    if ($bom != b"\xEF\xBB\xBF") {
        rewind($file, 0);
    }
    return $file; 
} 
?>

在Op选择“答案”TM之前,应该有24小时锁定。过早按下按钮太诱人了。

您能添加
var\u dump($data)
foreach
之前的
var\u dump($data)
添加到
var\u dump($columns)之后和我已更新的输出it@footy是否已打开所有错误报告?也许某个地方产生了一个错误……是的,这是我的第一个想法,我添加了
错误报告(E_ALL)到我的脚本。@footy和display\u错误也打开了吗?p、 请看答案。就连我也感到困惑。我已经准备好了完整的剧本。我也修剪它。但这种情况还是发生了。是不是要对文件做点什么?它是一个CSV逗号分隔文件,仅此而已。有两行。我在我的答案中上传了输入文件,并给出了一个链接。我也知道fgetcsv函数,但我只是尝试自己的方法,而不是用它来学习。现在我知道了CSV在一开始就有一些额外的符号的艰难方式!是的,它适用于您,因为
0=>string'FacilityID'(长度=10)
适用于您,而
0=>string'FacilityID'(长度=13)
适用于我!这里怎么了?我从CSV文件中读取数据。不确定,但您是否知道此功能:您可能需要将输入文件上载到我在回答中上载了输入文件并提供了链接的位置。我也知道fgetcsv函数,但我只是尝试自己的方法,而不是用它来学习。现在我知道了CSV在开始时有一些额外符号的艰难方式!:P+1表示正确的方向。但是fread($file,3)
不是有点粗糙吗?我的意思是它会一直保持3个“是”吗?文件类型会有所不同吗。有没有一种标准的方法可以做到这一点?除了等待PHP6(它承诺会有更完整的unicode支持)之外,下面是一个流行的BOM表,尽管您也应该这样做:$enc=mb\u detect\u encoding($buffer)$数据=mb_convert_编码($buffer,“ASCII”,$enc);因为BOM的存在是有原因的。
array
  'FacilityID' => string 'setFacilityID' (length=13)
  'FacilityName' => string 'setFacilityName' (length=15)
array
  0 => string 'FacilityID' (length=13)
  1 => string 'FacilityName' (length=12)
array
  0 => string '1' (length=1)
  1 => string '"Business Center"' (length=17)
FacilityID FacilityName called 1
<?php
$callback = array(
  'FacilityID' => 'setFacilityID',
  'FacilityName' => 'setFacilityName'
);
$columns = array(
  0 => 'FacilityID',
  1 => 'FacilityName'
);
$data = array(
  0 => '1',
  1 => '"Business Center"'
);

var_dump($callback);
var_dump($columns);
var_dump($data);

foreach ($data as $key=>$val) {
    if(isset($columns[$key]) && isset($callback[$columns[$key]])) {
        echo "---called $key---<br/>";
        call_user_func(array($this,$callback[$columns[$key]]),trim($val));
    }
}
array(2) {
  ["FacilityID"]=>
  string(13) "setFacilityID"
  ["FacilityName"]=>
  string(15) "setFacilityName"
}
array(2) {
  [0]=>
  string(10) "FacilityID"
  [1]=>
  string(12) "FacilityName"
}
array(2) {
  [0]=>
  string(1) "1"
  [1]=>
  string(17) ""Business Center""
}
---called 0---<br/>PHP Notice:  Undefined variable: this in /home/gerry/stack.php on line 22
PHP Warning:  call_user_func() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in /home/gerry/stack.php on line 22
---called 1---<br/>PHP Notice:  Undefined variable: this in /home/gerry/stack.php on line 22
PHP Warning:  call_user_func() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in /home/gerry/stack.php on line 22
<?php
// Reads past the UTF-8 bom if it is there. 
// Credit for the function: http://www.php.net/manual/en/function.fopen.php#78308
function fopen_utf8 ($filename, $mode) { 
    $file = fopen($filename, $mode); 
    $bom = fread($file, 3); 
    if ($bom != b"\xEF\xBB\xBF") {
        rewind($file, 0);
    }
    return $file; 
} 
?>