Строгие стандарты: только переменные должны передаваться по ссылке в строке ошибки

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

Строгие стандарты: только переменные должны передаваться по ссылке в /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;
                }

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


person gold1s    schedule 27.04.2018    source источник
comment
Привет, я улучшил форматирование вопроса (комментарий, помечающий строку 100, на самом деле не был виден!) Тем не менее, я предлагаю вам прочитать stackoverflow .com/help/mcve и задавайте вопросы в соответствии с этим руководством. Приятно то, что как только вы начнете минимизировать код, воспроизводящий проблему, вы с большей вероятностью найдете источник проблемы для себя. Кроме того, вы должны размещать такие темы, чтобы мы могли предложить те, которые вы пропустили. С наилучшими пожеланиями   -  person YakovL    schedule 28.04.2018
comment
Возможный дубликат Strict Standards: только переменные должны передаваться ошибка ссылки   -  person YakovL    schedule 28.04.2018


Ответы (2)


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);), но это не обязательно.

person jh1711    schedule 27.04.2018
comment
так что if(in_array(end(explode(".", $file)), изменить на if(in_array(end($tmp = explode(".", $file)), ? - person gold1s; 28.04.2018
comment
точно. Или вы можете использовать $ext, как вы сделали позже в своем коде. - person jh1711; 28.04.2018
comment
Я меняю на if(in_array(end($ext = explode(".", $file)), $extensions)&&is_file($dir.$file)) { $c++; } и ошибка все еще отображается - person gold1s; 28.04.2018
comment
Виноват. Я был уверен, что задание будет работать так, но, видимо, это не так. Я отредактирую ответ, чтобы исправить его. - person jh1711; 28.04.2018
comment
Ответ должен быть правильным сейчас. Извините за путаницу. - person jh1711; 28.04.2018
comment
Вы забыли о ; но да, это работает, спасибо! - person gold1s; 28.04.2018
comment
@ gold1s, если это отвечает на ваш вопрос, не забудьте принять его, нажав на галочку слева - person YakovL; 28.04.2018

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

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

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

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

Для справки

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

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

строка strrchr ( строка $haystack , смешанный $needle )

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

Таким образом, он просто находит последний . и возвращает его и все последующее, затем ltrim просто оставляет обрезку.

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

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

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 и все.

ОБНОВЛЕНИЕ

Вы можете сравнить эти два, используя 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 легче читать, если вы все равно знаете, что делает функция. Это довольно непонятная функция, но в основном она означает усиливание правогосправедливого выбораrактера.

Ваше здоровье.

person ArtisticPhoenix    schedule 27.04.2018
comment
Итак, не могли бы вы написать мне, что я должен заменить в своем коде? - person gold1s; 28.04.2018