呼叫时间传递引用已弃用?

时间:2011-02-15 22:00:31

标签: php

我在许多论坛中读到在变量中列出的任何$之前删除&符号(&),我这样做了,但这样做会删除我正在使用的代码的功能。我该怎么办?

演示here

代码在这里:

<?php 

$val = $_GET['name'];
$path = "./images/".$val."/";
$file_array = array ();
readThisDir ( $path, &$file_array );

echo '<div class="gallery" style="display:block;" id="'.$val.'">';
echo '<ul>';
foreach ( $file_array as $file )
{
  if (strstr($file, "png")||strstr($file, "jpg")||strstr($file, "bmp")||strstr($file, "gif"))
  {
   list($width, $height) = getimagesize($file);
   $info = exif_read_data($file);           
   echo '<li><a href="javascript:void(0);"><img src="'.$file.'" width="'.$width.'" height="'.$height.'" alt="'.$file.'"/></a><span>'.$info['Title'].'<div class="gallerynav"><a href="javascript:void(0);" class="prevproject">&laquo;</a><a href="javascript:void(0);" class="nextproject">&raquo;</a></div></span></li>';
  }
}

echo '</ul>';
echo '</div>';

  function readThisDir ( $path, $arr )
  {
    if ($handle = opendir($path)) 
    {
        while (false !== ($file = readdir($handle))) 
        {
            if ($file != "." && $file != "..") 
            {
              if (is_dir ( $path."/".$file ))
              {
                readThisDir ($path."/".$file, &$arr);
              } else {
                $arr[] = $path."/".$file;
              }  
            }
        }
        closedir($handle);
    }
  }
?>

4 个答案:

答案 0 :(得分:7)

你应该在函数声明中标记pass-by-reference,而不是调用函数的位置。

...
function readThisDir ( $path, &$arr )
{ ...

答案 1 :(得分:3)

更改

function readThisDir ( $path, $arr )

function readThisDir ( $path, &$arr )

readThisDir ($path."/".$file, &$arr);

readThisDir ($path."/".$file, $arr);

PHP不希望您将变量的地址直接传递给函数。

答案 2 :(得分:2)

它不会直接回答您的问题,但您可以使用RecursiveDirectoryIterator替换所有代码(假设为5.2+):

$it = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($path);
);
$files = array();
foreach ($it as $file) {
    $files[] = $file->getPathname();
}

答案 3 :(得分:0)

使函数readThisDir返回一个填充了文件信息的数组,并将其分配给$ file_array变量。 类似的东西:

$file_array = readThisDir ($path);

function readThisDir ( $path)
{
        $arr = array ();
    if ($handle = opendir($path)) 
    {
        while (false !== ($file = readdir($handle))) 
        {
            if ($file != "." && $file != "..") 
            {
              if (is_dir ( $path."/".$file ))
              {
                readThisDir ($path."/".$file, &$arr);
              } else {
                $arr[] = $path."/".$file;
              }  
            }
        }
        closedir($handle);
    }
        return $arr;
}