这是我的脚本(部分内容,但它涵盖了我想说的内容):
$data = explode($this->delimeter,$buffer);
var_dump($this->callBack);
var_dump($columns);
foreach ($data as $key=>$val) {
if(isset($columns[$key]) && isset($this->callBack[$columns[$key]])) {
echo "called $key<br/>";
call_user_func(array($this,$this->callBack[$columns[$key]]),trim($val));
}
}
这是它的输出:
array
'FacilityID' => string 'setFacilityID' (length=13)
'FacilityName' => string 'setFacilityName' (length=15)
array
0 => string 'FacilityID' (length=13)
1 => string 'FacilityName' (length=12)
called 1
我的问题:
为什么called 1
仅在called 0
未出现在输出中时出现?我的意思是$this->callBack[$columns[$key]]
两者都存在吗?我错过了什么。
从我看到的内容:isset($columns[$key])
TRUE
为isset($this->callBack[$columns[$key]])
,而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");
}
}
的第二个条件为“FacilityID”,为什么?
PS:从我看到的所有索引都已定义。
编辑2 我的脚本功能完整:
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
我的更新输出:
{{1}}
答案 0 :(得分:1)
有一件事我注意到0 => string 'FacilityID' (length=13)
看起来不对... FacilityID
只有10个长度...不知道你是如何结束这个但是开始的东西...尝试修剪你的价值观$columns
因为那里肯定有一些不好的角色。或者尝试找出在执行的其余部分中哪些值被破坏。
<强>更新强>
请参阅此问答What does it mean when var_dump reports the wrong string length?
csv是否包含可能会破坏字符串长度的xml / html。另外,请使用fgetcsv来简化该代码。您可能会发现单独修复您的代码,因为它会处理为您清理行和分隔符。
答案 1 :(得分:1)
<?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可以选择“The Answer”TM之前应该有24小时锁定。提前按下按钮太诱人了。
答案 2 :(得分:0)
<?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
所以我猜这是你提供给我们的代码之外的东西,或者提供的数据不准确。
答案 3 :(得分:0)
这是一个非常奇怪的错误。每个人都试图回答这个问题,但是我发现错误不是脚本,而是我正在阅读的外部文件。该文件位于here。如果我以某种方式使用了这个额外的3个字符,即使调用了trim()
没有被修剪进入输入。如果有人能够更好地了解这个问题,那将是件好事。可能这本身就是一个新问题。
但我通过将内容从记事本复制粘贴到另一个文件并保存它来解决这个问题。但这不是一个好方法。如果有人有更好的答案,请发布。