2016-01-21 120 views
0

调试看起来像是一个简单的问题,我担心这个模块可能有问题,我忽略了它的简单性:解析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" 
    } 

在我所有的测试中,我都得到了第一个结果,但是有一个潜在的情况我错过了这个函数可能导致这个问题的地方?

谢谢你的时间。

+0

第二个例子是不可能的,你发布的代码。请粘贴完整或实际的代码。 – Daan

+0

“在一些边缘情况下”这些情况具体是什么? –

+2

根本看不到这是可能的。 foreach()不会因为它的头发日不好而神奇地重复一次额外的时间。 –

回答

1

我不知道这些边缘情况应该如何可能。但无论如何,你正在做一个案例的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; 
} 
+0

根本不需要修改数组。 [end()](http://php.net/end)也可以。 –

+0

@MarcB当然,谢谢你的建议 – kero

0

也许就一个主题的变化,但它最初似乎过于复杂:

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)); 
0

您提供永远不会产生你已经包括了输出的代码。我认为你的代码真的比这个复杂得多,你已经删除了你认为不必要的东西。问题可能是由于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); 
}