我在将对象分配给数组时遇到了一些问题,希望这是一个简单的错误,我疲惫的眼睛缺失了。
取以下代码
<?php
$fruits = array('apple', 'banana', 'orange', 'grape');
foreach($fruits as $fruit){
$newArray[] = $fruit;
}
print_r($newArray);
?>
结果:
Array ( [0] => apple [1] => banana [2] => orange [3] => grape )
一切都好,这就是我想要的。现在我在DirectoryIterator
中使用相同的基本逻辑
<?php
$path = 'to/my/path';
foreach(new DirectoryIterator($path) as $fileInfo) {
$newArray[] = $fileInfo;
}
print_r($newArray);
?>
结果很奇怪。如果我执行count($newArray)
,它会返回我期望的文件数的正确值,但$newArray
的每个值都是空的。
编辑:
如果我在foreach内var_dump($fileInfo)
,我会得到一个有效的对象。这里有一个例子。
object(DirectoryTerator)#26(4){["pathName":"SplFileInfo":private]=>string(35)"application/logs/log-2014-01-03.php"["fileName":"SplFileInfo":private]=>string(18)"log-2014-01-03.php"["glob":"DirectoryTerator":private]=>布尔(false)["subPathName":"RecursiveDirectoryTerator":private]=>字符串(0)"}
编辑2:
我想分配的[]可能有对象问题,所以我使用了array_push()
,它给出了相同的结果。
我还认为可能在将对象分配给数组时出现了问题,所以我创建了一个新的简单类,并将其中的两个对象添加到数组中。效果很好。
你能试试这个吗,
foreach (new DirectoryIterator($path) as $fileInfo) {
if($fileInfo->isDot()) continue;
// $newArray['filename'][] = $fileInfo->getFilename();
//$newArray['pathname'][] = $fileInfo->getPathname();
$newArray[] = &$fileInfo;
}
怎么样:
<?php
$path = 'to/my/path';
$files = new DirectoryIterator($path);
foreach($files as $fileInfo) {
$newArray[] = $fileInfo;
}
print_r($newArray);
?>
好的,谢谢你的帮助,但我终于找到了解决方案。从PHP5开始,对象是通过引用传递的,而不是通过值传递的。因此,为了将所有迭代添加到数组中,我首先需要clone
它们。
这是代码
<?php
$path = 'to/my/path';
foreach(new DirectoryIterator($path) as $fileInfo) {
$newArray[] = clone $fileInfo;
}
所以@KrishR你很接近,只是走错了方向。
和一个参考:
如何在PHP 中将对象的副本推入数组
再次感谢。