Строгие стандарты: только переменные должны передаваться по ссылке в ... - строка ошибки - PullRequest
0 голосов
/ 28 апреля 2018

У меня ошибка как это:

Строгие стандарты: только переменные должны передаваться по ссылке в /file.php в строке 100

В файле file.php строка выглядит так:

foreach($filelist as $value => $file) {
    // ABOVE LINE IS LINE 100
    if(in_array(end(explode(".", $file)), $extensions)&&is_file($dir.$file)) { $c++; }
    if(IsSet($_GET['start'])) {
        $nav = $_GET['start'];
    } else {
        $nav = "0";
    }
    if(($c > $nav) && ($c < $nav+($pagerows+1))) {
        $link = $dir . $file;
        $hlink = $http . $file;
        $ext = explode(".", $file);
        if(in_array(end($ext), $extensions)&&is_file($link)) {
            $p++;
            if(file_exists($link)) {
                list($width, $height, $type, $attr) = getimagesize($link);
                if($height > SMALL_IMAGE_HEIGHT) {
                    $imageheight = SMALL_IMAGE_HEIGHT;
                } else {
                    $imageheight = $height;
                }

Не могли бы вы мне помочь? Я нашел такие темы, но в полдень код был похож на мой.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Ну, вы можете использовать что-нибудь получше, чтобы получить расширение, подобное этому

$ext = strrchr($file, ".");

Единственная разница в том, что . сохраняется, поэтому, если $file равно somefile.txt, возвращается .txt, что, если вы хотите избавиться от вас, всегда может сделать это

$ext = ltrim(strrchr($file, "."), '.');

Для справки

http://php.net/manual/en/function.strrchr.php

strrchr - Найти последнее вхождение символа в строку.

строка strrchr ( строка $ стог сена, смешанная $ игла)

Эта функция возвращает часть стога сена, которая начинается при последнем появлении иглы и продолжается до конца стога сена.

Так что он просто находит последний . и возвращает это и все после, тогда ltrim это просто «левая» обрезка.

P.S. Мне очень не нравится использовать Explode для получения расширения, это одна из моих любимых мозолей.

Так что для вашего конкретного случая я бы:

foreach($filelist as $value => $file) {
    $ext = ltrim(strrchr($file, "."), '.');
    if(in_array($ext, $extensions) && is_file($dir.$file)) { $c++; } 

    if(isset($_GET['start'])) { $nav = $_GET['start']; } else { $nav = "0"; }
    if(($c > $nav)&&($c < $nav+($pagerows+1))) {
    $link = $dir . $file;
    $hlink = $http . $file;

    //$ext = explode(".", $file); we've already done this no need to do it again

Таким образом, вы получаете расширение один раз, вы не создаете для него массив explode, вы не перемещаете указатель массива в конец массива end, и это все.

UPDATE

Вы можете сравнить эти два с помощью microtime, чтобы увидеть, что быстрее, они оба действительно быстрые, поэтому нам нужно выполнить около 100 тыс. Итераций, чтобы проверить это, например:

$filename = "filename.php";

$start = microtime(true);

for($i=0; $i<=100000; $i++){
    $v=explode(".", $filename);
    $ext1 = end($v);
}

echo "1. ext='$ext1' Complete ".number_format((microtime(true) - $start), 4).PHP_EOL;

$start = microtime(true);

for($i=0; $i<=100000; $i++){
    $ext2 = ltrim(strrchr($filename, '.'), '.');

}

echo "2. ext='$ext2' Complete ".number_format((microtime(true) - $start), 4).PHP_EOL;

Выходы

 1. ext='php' Complete 0.0178
 2. ext='php' Complete 0.0098
 ----------------------------
 1. ext='php' Complete 0.0237
 2. ext='php' Complete 0.0125
 ---------------------------
 1. ext='php' Complete 0.0252
 2. ext='php' Complete 0.0098
 ---------------------------
 1. ext='php' Complete 0.0190
 2. ext='php' Complete 0.0102

Вы можете проверить это здесь онлайн

Ясно одно: это почти в 2 раза быстрее, но в данном случае это не имеет большого значения. Но проверять эти вещи никогда не повредит. Оба дают эквивалентные результаты, но strrchr легче читать, хорошо, если вы знаете, что делает функция в любом случае. Это своего рода неясная функция, но в основном это означает str ing r ight ch a r acter.

Приветствие.

0 голосов
/ 28 апреля 2018

end принимает свой параметр по ссылке, потому что он изменяет массив. И. е. он перемещает итератор массива к последнему элементу и возвращает последний элемент. Вот почему вы получаете предупреждение. Вы можете удалить его, если просто замените строку, которая выдает ошибку:

if(in_array(end(explode(".", $file)), $extensions)&&is_file($dir.$file)) { $c++; }

Заменить на:

$ext = explode(".", $file); 
if(in_array(end($ext), $extensions)&&is_file($dir.$file)) { $c++; }

Как вы делали в более поздней части вашего кода.

Тогда вы также можете удалить строку 105 ($ext = explode(".", $file);), но это не обязательно.

...