解析PHP数组时遇到不正确的重复问题
调试看起来像是一个简单的问题,我担心这个模块可能有问题,我忽略了它的简单性:解析PHP数组时遇到不正确的重复问题
function sendUploads(array $files)
{
$fileCount = count($files)-1;
$lastFile = false;
foreach ($files as $fileKey => $file) {
if ($fileKey == $fileCount) {
$file = $file . ' is the lastfile';
}
$uploads[] = $file;
}
var_dump($uploads);
}
$files = array('file1', 'file2', 'file3', 'file4', 'file5');
sendUploads($files);
预期的结果将是:
array(5) {
[0] =>
string(5) "file1"
[1] =>
string(5) "file2"
[2] =>
string(5) "file3"
[3] =>
string(5) "file4"
[4] =>
string(21) "file5 is the lastfile"
}
但在某些边缘情况,我们看到这样的结果,而不是:
array(5) {
[0] =>
string(5) "file1"
[1] =>
string(5) "file2"
[2] =>
string(5) "file3"
[3] =>
string(5) "file4"
[4] =>
string(21) "file5 is the lastfile"
[5] =>
string(21) "file5 is the lastfile"
}
在我所有的测试中,我都得到了第一个结果,但是有一个潜在的情况我错过了这个函数可能导致这个问题的地方?
谢谢你的时间。
我不知道这些边缘情况应该如何可能。但无论如何,你正在做一个案例的n-1 if
比较。你为什么不只是end
它并自行管理它?
function sendUploads(array $files)
{
$length = count($files);
if ($length < 1)
return array();
$uploads = array();
$last = end($files);
for ($i=0; $i<($length-2); $i++) {
$uploads[] = $files[$i];
}
$uploads[] = $last . " is the last file";
return $uploads;
}
根本不需要修改数组。 [end()](http://php.net/end)也可以。 –
@MarcB当然,谢谢你的建议 – kero
也许就一个主题的变化,但它最初似乎过于复杂:
function sendUploads($files=array()){
if(empty($files)) return false;
$pop=array_pop($files);
$uploads=$files;
$uploads[]=$pop.' is the last file';
return $uploads;
}
$files = array('file1', 'file2', 'file3', 'file4', 'file5');
if(!empty($files)) var_dump(sendUploads($files));
您提供永远不会产生你已经包括了输出的代码。我认为你的代码真的比这个复杂得多,你已经删除了你认为不必要的东西。问题可能是由于PHP中的所有数组都是关联的 - 即使索引是整数值。它很可能有一个数组,密钥{-1,0,1,“banana”,300}。期望这样的哈希映射具有明确的顺序似乎是可达到的。
我能想到的(kingkero的是比较纯的)最简单的解决办法是:
function sendUploads(array $origfiles)
{
$fileCount = count($files)-1;
$lastFile = false;
$files=array_values($origfiles);
// or if this still causes pain sort(array_values($origfiles))
foreach ($files as $fileKey => $file) {
if ($fileKey == $fileCount) {
$file = $file . ' is the lastfile';
}
$uploads[] = $file;
}
var_dump($uploads);
}
第二个例子是不可能的,你发布的代码。请粘贴完整或实际的代码。 – Daan
“在一些边缘情况下”这些情况具体是什么? –
根本看不到这是可能的。 foreach()不会因为它的头发日不好而神奇地重复一次额外的时间。 –