Чат Telegram
Группа ВКонтакте
Новый комментарий


1nSide

1 задача, сделал запись в фаил чисел от 100 до 1 и вывод их из этого файла

$file = fopen(__DIR__ . '/file4.txt', 'w');
for ($i = 100; $i>= 1; $i--) {
    fputs($file, $i . PHP_EOL);
}

$file = fopen(__DIR__ . '/file4.txt', 'r');
while (!feof($file)) {
    echo fgets($file);
    echo '<br>';
}
fclose($file);
ivashkevich

А зачем? Нужно было написать скрипт, который выводит свой собственный код.

1nSide

2 задачу не понял как делать

ivashkevich

Что именно не поняли? На каком пункте?

AnatolyMartyanov

1 задание

<?php
$file = file_get_contents(__FILE__);
echo $file;

или

<?php
$file = fopen(__FILE__ , 'r');
while  (!feof($file)) {
    echo fgets($file);
    echo '<br>';
}
ivashkevich

Отлично ;)
А можно было вообще написать echo file_get_contents... без использования переменных

AnatolyMartyanov

Понял, спасибо

lig7771991@list.ru

Первый вариант у меня ничего не выводит на экран, только второй...

Pavel-Tonk

У меня та же проблема.

Fellini

Видимо потому, что браузеру передаются данные, форматированные как php-код, и тот их скрывает.
Но если открыть исходный код, то будет его показывать, хотя обычно не должен.

AnatolyMartyanov

2 задание

$dir = '../file';
$files = scandir($dir);
foreach ($files as $file) {
    echo $file . '<br>';
}

foreach ($files as $dirr) {
    if (is_dir($dirr)) {
        echo $dirr . '<br>';
    }
}
ivashkevich

Тут всё хорошо, но нужно использовать константу __DIR__

DmitryGavrilov
<?php
//Выведите список всех файлов в текущей директории скрипта.
//Создайте теперь в директории со скриптом несколько папок.
//Сделайте так, чтобы в списке, выводимом программой, остались только папки.

//выводим файлы
$files = scandir(__DIR__ . '/');
foreach ($files as $file) {
echo $file . '<br>';
}

//выводим папки как папки, прокольно что есть is_dir)
$files = scandir(__DIR__ . '/');
foreach ($files as $dirr) {
    if (is_dir($dirr)) {
        echo $dirr . '<br>';
    }
}

?>
ivashkevich

Всё хорошо.

Закрывающий тег ?> в конце не нужен.

rusgil

Во примерах для открытия файлов и includ'ах используется DIR.
А зачем нужен абсолютный путь, почему не воспользоваться относительным?
В чем разница относительных и абсолютных путей?

ivashkevich

Потому что константа __DIR__ содержит путь до директории с файлом, в котором она написана. А если мы внутри /index.php подключим файл в папке /inc/123.php, в котором будет ещё один include, то он сработает относительно того файла, который мы запустили, а не в котором этот include написан. То есть если в /inc/123.php будет код:

include '456.php';

То подключится не файл /inc/456.php, а /456.php. Не в одной директории с файлом где написан include, а в одной директории с файлом, к которому мы обратились (/index.php).

Использование __DIR__ эту проблему решает.

Fox-24

Привет! Благодарю за урок!) Все супер)

1.

<?php
// Напишите программу, которая выводит свой собственный код.
// Сделайте так, чтобы в этой программе не было упоминания имени самого скрипта
// (если программа лежит в файле homework.php, то упоминания homework.php не должно быть в исходнике).

$file = fopen(__FILE__, 'r');
while (!feof($file)) {
    echo fgets($file);
    echo '<br>';
}
fclose($file);

2.

<?php
// Выведите список всех файлов в текущей директории скрипта.
$dir = __DIR__ . '/';
$files = scandir($dir);

foreach ($files as $value) {
    echo $value . '</br>';
}

3. Тут я немного больше сделал:)

<?php
// Создайте теперь в директории со скриптом несколько папок.
// Сделайте так, чтобы в списке, выводимом программой, остались только папки.

// Массив с именами новых папок
$newfolders = ['folder-1', 'folder-2', 'folder-3'];

// Если папки еще не существуют, создаем новые
foreach ($newfolders as $folder) {
    if (!is_dir($folder)) {
        mkdir($folder, 0700);
    }
}

// Задаем директорию и получаем массив с файлами
$dir = __DIR__ . '/';
$files = scandir($dir);

// Выводит список всех папок
foreach ($files as $value) {
    if (is_dir($value))
        echo $value . '</br>';
}
ivashkevich

Отлично =)

dom1r
  1. Мне показалось через fgets лучше, т.к он построчно выводит, а file_get_contents через пробел
<?php
echo "hello";

$file = fopen(__FILE__, 'r');
while (!feof($file)) {
    echo fgets($file);
    echo '<br>';
}
fclose($file);

2.

<?php
//выводит список файлов без директории
$filelist = [];

if ($handle = opendir(__DIR__)) {
    while (false !== ($entry = readdir($handle))) {
        if (is_file($entry)) {
            $filelist[] = $entry;
        }
    }

    closedir($handle);
}

print_r($filelist);
<?php
//выводит список папок
$filelist = [];

if ($handle = opendir(__DIR__)) {
    while (false !== ($entry = readdir($handle))) {
        if (is_dir($entry)) {
            $filelist[] = $entry;
        }
    }

    closedir($handle);
}

print_r($filelist);
ivashkevich
  1. Строки схлопывает браузер, если посмотрите исходный код страницы, то увидите переносы строк. В Вашем варианте новые строки выводятся из-за ручного добавления тега <br> после каждой строки. Также можно было весь вывод обернуть в тег <pre>.
  2. Хорошо
  3. Хорошо
ArtemijeKA
  1. $file = fopen($_SERVER['SCRIPT_FILENAME'], 'rb');
    while (!feof($file)) {
        echo fgets($file);
        echo '<br>';
    }
    fclose($file);
  2. $listFiles = array_diff(scandir(__DIR__), array('..', '.'));
    foreach ($listFiles as $fileName) {
        echo $fileName;
        echo '<br>';
    }
  3. $listFiles = array_diff(scandir(__DIR__), array('..', '.'));
    foreach ($listFiles as $fileName) {
        if (is_file($fileName)) {
            continue;
        }
        echo $fileName;
        echo '<br>';
    }

Спасибо за уроки!

ivashkevich

Хорошо, но:

  1. для получения пути до скрипта лучше использовать константу __FILE__, так как $_SERVER['SCRIPT_FILENAME'] не всегда покажет скрипт, в котором этот код написан.
  2. вместо array(1, 2) уже давно принято использовать запись [1, 2] - переучивайтесь.
ArtemijeKA

А когда $_SERVER['SCRIPT_FILENAME'] не покажет текущий файл? Когда вставлен в файле через require ?

ivashkevich

Да

ArtemijeKA

Спасибо

Benya
<?php
$data = htmlspecialchars(file_get_contents(__FILE__));
echo $data;
ivashkevich

Отлично!

Benya
<?php
$files = scandir(__DIR__ . '/');
foreach ($files as $file) {
    if (is_dir($file)) {
        echo $file . '<br>';
    }
}
ivashkevich

Супер!

SBTesla
$file = fopen(__FILE__ , 'r');
while (!feof($file)) {
    echo fgets($file);
    echo '<br>';
}

fclose($file);
//--------------------------------------------------

$dir = __DIR__. '/';
$file = scandir($dir);

foreach ($file as $value) {
    echo $value. '<br>';
}
ivashkevich

Хорошо

demyanovpaul@yandex.ru

Напишите программу, которая выводит свой собственный код.
Сделайте так, чтобы в этой программе не было упоминания имени самого скрипта (если программа лежит в файле homework.php, то упоминания homework.php не должно быть в исходнике).

echo file_get_contents(__FILE__);

Выведите список всех файлов в текущей директории скрипта.
Создайте теперь в директории со скриптом несколько папок.
Сделайте так, чтобы в списке, выводимом программой, остались только папки.

foreach(scandir(__DIR__ . '/') as $file)
    if(is_dir($file))
        echo $file . '<br>';
ivashkevich

1 - ОК.
2 - НЕ ОК. Используйте фигурные скобки для тела цикла и условий! Это стандарт в мире PHP. Вам рановато про это читать, но раз уж игнорируете мои комментарии, то почитайте вот это =)

demyanovpaul@yandex.ru
foreach(scandir(__DIR__ . '/') as $file){
    if(is_dir($file)){
        echo $file . '<br>';
    }
}

Извините, старые привычки засели глубоко)Я читал, просто не увидел)
Я читал PSR. Это у меня от другого языка въелось)

ivashkevich

Понял, ок)

virtual2018

задача 1

//в случае php/html файла без обработки функцией htmlspecialchars, будет пустая страница
//необходимо преобразовать в html сущности
$data = htmlspecialchars(file_get_contents(__FILE__));
echo $data;

задача 2 - список файлов

if ($array_file = scandir(__DIR__)) {
    foreach ($array_file as $index) {
        if (is_file($index)) {
            echo '<br>' . $index;
        }
    }
}

задача 2.1 - список директорий

if ($array_file=scandir(__DIR__)) {
    foreach ($array_file as $index) {
        // отсеим стандартные указатели на текущую и вышестоящую диреторию
        if (is_dir($index) && $index != '.' && $index != '..') {
            echo '<br>'.$index;
        }
    }
}
ivashkevich

Отлично

Bogdan

//Напишите программу, которая выводит свой собственный код.

//$file = fopen(__FILE__, 'r');
//while (!feof($file)) {
//    echo fgets($file);
//    echo '<br>';
//}
//fclose($file);

//Выведите список всех файлов в текущей директории скрипта.

$showAllFiles = scandir(__DIR__);
foreach ($showAllFiles as $value) {
    echo $value . '<br>';
}

// Сделайте так, чтобы в списке, выводимом программой, остались только папки.

$showAllDirs = scandir(__DIR__);
foreach ($showAllDirs as $value) {
    echo is_dir($value) ? $value  . '<br>': '';
}
ivashkevich
  1. Почему все закомментировано?
  2. ОК
  3. ОК
ashfedor
$url = $_SERVER['PHP_SELF'];

$file = fopen(__DIR__ . $url, 'r');
while (!feof($file)){
    echo fgets($file);
    echo '<br>';
}
fclose($file);
ivashkevich

Есть константа:

__FILE__
ashfedor
$dir = __DIR__ . '/';

foreach (scandir($dir) as $files ){
    if (is_dir($files)){
        echo $files . '<br>';
    }
}
ivashkevich

Отлично

babls2332@gmail.com
<?php
$file = fopen(__FILE__, 'r');
while (!feof($file)) {
    echo fgets($file);
    echo '<br>';
}

$files = scandir(__DIR__);

foreach ($files as $dir) {
    if (is_dir($dir)) {
        echo $dir . '<br>';
    }
}
ivashkevich

Отлично!

rashik-2009@yandex.ru
Привет. Просто скопировал по уроку и
возникает такая ошибка, название файлов совпадает, лежит все в одной директории, могут быть еще какие то причины этой ошибки? 

Warning: fopen(C:\xampp\htdocs/file.txt): failed to open stream: No such file or directory in C:\xampp\htdocs\files.php on line 2

Warning: fgets() expects parameter 1 to be resource, bool given in C:\xampp\htdocs\files.php on line 4

Warning: fgets() expects parameter 1 to be resource, bool given in C:\xampp\htdocs\files.php on line 4

Warning: fgets() expects parameter 1 to be resource, bool given in C:\xampp\htdocs\files.php on line 4

Warning: fgets() expects parameter 1 to be resource, bool given in C:\xampp\htdocs\files.php on line 4

Warning: fclose() expects parameter 1 to be resource, bool given in C:\xampp\htdocs\files.php on line 7
ivashkevich

C:\xampp\htdocs/file.txt - пишет, что файла такого нет. Выбрали xampp вместо OpenServer - разбирайтесь сами, что там не так, я предупреждал)

rashik-2009@yandex.ru

Код заработал, но только через расширение PHP. Т.е. так

<?php
$file = fopen(__DIR__ . '/file.php', 'r');

Как я понял, что работает только через PHP, txt просто не видит, может это особенность работа xampp ну и ладно)).
Зато файлы он "рисует", а правильно я понимаю, что вносить информацию таким способом можно не только в txt-файлы? Можно, например, вывести текст в pdf-файл. Я попробовал, но файл почему-то не открылся((.

ivashkevich

Потому что PDF - это не просто текст, это формат данных со специальными правилами. Про то, что якобы данные пишутся в .php-файл, но не пишутся в .txt - звучит как-то неправдоподобно. Скорее всего, есть еще что-то.

rashik-2009@yandex.ru

Да, точно есть, на домашнем компе все работает, на рабочем (как раз на нем я это задание и пытался выполнить впервые) пишет файл не найден. Я еще когда html и css изучал заметил, что стили не работают(если их с внешнего файла подключать), что то с рабочим компом.

ivashkevich

Вы скопируйте с рабочего компа на домашний и сравните файлы. Где-то будет отличие.

Grewi

Первое задание:

//Выводим содержимое файла программы
$fOpen = fopen(__FILE__, 'r');

while (!feof($fOpen)) {
    echo htmlentities(fgets($fOpen)).'</br>';
}

Второе задание:

//Выводим список категорий
$dir = scandir(__DIR__ . '/work');
foreach ($dir as $a) {
    if ($a == '.' || $a == '..') { //Удаляем ненужные элементы массива
        continue;
    }
    $i = iconv('windows-1251', 'utf-8', $a); //Правим кодировку

    if (is_dir(__DIR__ . '/work/' . $a)) {
        echo '<p><strong style="color: red;">Папка: </strong>' . $i . '</p>';
    }
}

//Выводим список файлов
foreach ($dir as $a) {
    if ($a == '.' || $a == '..') { //Удаляем ненужные элементы массива
        continue;
    }
    $i = iconv('windows-1251', 'utf-8', $a); //Правим кодировку

    if (is_file(__DIR__ . '/work/' . $a)) {
        $path_parts = pathinfo($i);
        echo '<p><strong style="color:blue;">Файл: </strong>';
        echo $path_parts['filename'];
        echo '<b>.'.$path_parts['extension'].'</b>';
        echo '</p>';
    }
}

//Создаем директории из массива
$newFold = ['Папка--1', 'Папка--2', 'Папка--3'];
foreach ($newFold as $i) {
    $i = iconv('utf-8//IGNORE', 'windows-1251', $i);
    if (file_exists(__DIR__ . '/work/' . $i) == false) {
        mkdir(__DIR__ . '/work/' . $i);
    }
}

//Удаляем файлы из директории
foreach ($dir as $g){
    if(is_file(__DIR__.'/work/'.$g)){
        unlink(__DIR__.'/work/'.$g);
    }
}
ivashkevich

Отлично разобрались! Так держать =)

Grewi

Спасибо и за поддержку и классные уроки, но пока получается медленнее, чем хотелось. Не все сразу запоминается, иногда приходиться возвращаться к прошлым материалам и повторять. Но процесс захватывающий.

ivashkevich

Это главное, что нравится. Остальное вообще не важно)

polvanovv

1.

echo file_get_contents(__FILE__);

2.1

$dir = scandir(__DIR__);
foreach ($dir as $resource){
    echo $resource;
    echo '<br>';
}

2.2

$dir = scandir(__DIR__);
foreach ($dir as $folder){
    if (is_dir($folder)) {
        echo $folder;
        echo '<br>';
    }
}
ivashkevich

Отлично

Boodoo
<?php
    $text = htmlspecialchars(file_get_contents(__FILE__));
    echo $text;

    $arr = scandir(__DIR__);
    foreach($arr as $elem) {
        echo $elem . '<br>';
    }

    for($i=1; $i<4; $i++) {
        mkdir('folder' . $i);   
    }

    $arr = scandir(__DIR__);
    foreach($arr as $elem) {
        if(is_dir($elem)) {
            echo $elem . '<br>';
        }
    }
ivashkevich

Отлично!

Dram

Домашка №1 (были проблемы с кодировкой комментов, пришлось изгалиться)

<?php
//Напишите программу, которая выводит свой собственный код.
//Сделайте так, чтобы в этой программе не было упоминания имени самого скрипта
//(если программа лежит в файле index.php, то упоминания index.php не должно быть в исходнике).

$file = file_get_contents(__DIR__ . '/index.php');

$file=str_replace('index.php', '', $file);

file_put_contents(__DIR__ . '/file.txt', iconv('utf-8', 'windows-1251', $file));
ivashkevich

Выводить код нужно в браузер. Никаких имён файлов быть не должно

Dram
<?php
$file = file_get_contents(__DIR__ . '/index.php');

$file=str_replace('index.php', '', $file);

var_dump($file);

Скажите, пожалуйста, почему в коде выше не работает

echo $file;
print_r($file);

P.S. прошу проверить домашку в соседних уроках, я за последние дни урока 4-5 прошел вроде...

ivashkevich

Советую вам посмотреть решения других учеников. Чтобы не использовать имя текущего файла используется константа __FILE__

artemship
<?php

//Вывод исходного кода программы
$data = htmlspecialchars(file_get_contents(__FILE__));
echo $data;
echo '<br><br>';

//Вывод файлов
$directoryContents = scandir(__DIR__);
foreach ($directoryContents as $item) {
    if (is_file($item)) {
        echo $item . '<br>';
    }
}
echo '<br>';

//Создание папок, если их нет
$folderName = 'folder_';
for ($i = 1; $i < 4; $i++) {
    if (!is_dir($folderName . $i)) {
        mkdir($folderName . $i);
    }
}

//Вывод папок
$directoryContents = scandir(__DIR__);
foreach ($directoryContents as $item) {
    if (is_dir($item) && $item !== '.' && $item !== '..') {
        echo $item . '<br>';
    }
}
ivashkevich

Супер!

krollik1000000@gmail.com
$file = fopen(__file__,'r');
while(!feof($file)) {
    echo fgets($file);
}
fclose($file);

$way = scandir(__DIR__ . '/');

forEach($way as $key) {
    if (!is_file($key) && $key != '.' && $key != '..') {
       echo $key . '<br>';
    }
}
ivashkevich

Отлично

Moskva

1 :

$file = fopen(__FILE__, 'r'); 
while (!feof($file)){
    echo fgets($file) . '<br>';
}
fclose($file);

2.1 :

$file = scandir(__DIR__); 
foreach ($file as $string){
    echo $string . '<br>';
}

2.2 :

$file = scandir(__DIR__);
foreach ($file as $string){
    if(is_dir($string)) { 
        echo $string . '<br>';
    }
}
ivashkevich

Супер! По первому заданию советую посмотреть еще другие решения, есть вариант в одну строку =)

Moskva

Попробовал в 1-м задании заменить на

echo file_get_contents(__FILE__);

Не работает, эта команда запускается только когда есть этот кусок кода

while (!feof($file)){
    echo fgets($file) . '<br>';
}

Полностью так выглядит

$file = fopen(__FILE__, 'r');
while (!feof($file)){
    echo fgets($file) . '<br>';
}
fclose($file);

echo file_get_contents(__FILE__);

Ну и соответственно содержимое файла выводит дважды.

ivashkevich

Такого быть не может. Проверьте ещё раз. Скорее всего не сохранили файл.

esqrx

/// 1

var_dump(file_get_contents(__FILE__));
ivashkevich

Супер!

esqrx

// 2.1

// Можно было и без **IF** обойтись, просто вывести
// можно ли сократить условие **IF** ??

$filesDir = scandir(__DIR__);
foreach ($filesDir as $item) {
    if ($item !== '.' and $item !== '..') {
        echo $item . '<br>';
    }
}
ivashkevich

!in_array можно, но и так норм

esqrx

// 2.2

$filesDir = scandir(__DIR__);
foreach ($filesDir as $item) {
    if (is_dir($item)) {
        if ($item !== '.' and $item !== '..') {
            echo $item . '<br>';
        }
    }
}
ivashkevich

Отлично

Reechniy
дз1
<?php
$file=file_get_contents(__FILE__);
echo $file;

дз2
<?php
$file=scandir(__DIR__.'/');
foreach ($files as $file) {
    echo $file.'<br>';
}
$files=scandir(__DIR__.'/');
foreach ($files as $dirr){
    if (is_dir($dirr)){
        echo $dirr .'<br>';
    }
}
ivashkevich

Отлично

AlexxxEy

Задание 1.

$file = fopen( __FILE__, 'r');
while(!feof($file)){
    echo fgets($file) . '</br>';
}

Задание 2.

$file = scandir(__DIR__ . '/');
foreach($file as $files){
    echo $files . '</br>';
}

foreach($file as $files){
    if(is_dir($files))
    {
        echo $files . '</dir>';
    }
}
ivashkevich

Отлично

Blook

1.

$file = fopen(__FILE__, 'r');

while (!feof($file)) {
    echo fgets($file);
    echo '<br>';
}

fclose($file);

2.

//Убираем точки с массива
$dirInfo = array_diff_assoc( scandir(__DIR__), ['.', '..'] );

foreach ($dirInfo as $subject) {
    if(is_dir($subject)) {
        echo $subject . '<br>';
    }
}
ivashkevich

Отлично!

Dreft

Задача 1.

var_dump(file_get_contents(__FILE__));

Задача 2.

$files = scandir(__DIR__);
foreach ($files as $file) {
    if (is_file($file)) {
        echo $file . "<br>";
    }
}

Задача 2.1

$files = scandir(__DIR__);
foreach ($files as $file) {
    if (!is_file($file) && $file != '.' && $file != '..') {
        echo $file . "<br>";
    }
}
ivashkevich
  1. Отлично
  2. Отлично
Vladimir96
<?php
//Задание 1
    $file = fopen(__DIR__ . '/file2.php' , 'r');

    while(!feof($file)) {
        echo fgets($file);
        echo '<br>';
    }

    fclose($file);

//Задание 2
    $fileList = opendir("C:/OSPanel/domains/textfile.loc");

    if($fileList) {       

        while($entry = readdir($fileList)){
            if (is_dir($entry)) {
                echo $entry."<br />";
            }
        }

        closedir($fileList);
    }
ivashkevich

Всё ок, но в первом задании можно было проще - использовать функцию file_get_contents

Naskek

описание картинки

У меня почему-то вместо текста в браузере знаки вопроса, в чем может быть проблема ?

ivashkevich

В кодировке

Ooleg

Это было пока что самое сложное задание, все три задания выполнил в одном файле, но первое опустил в самый конец кода. С нетерпением жду критику, задание далось тяжело и уверен, что использовал не самый оптимальный способ его выполнения.
P.S. Посмотрел как другие выполнили, слишком сложно у меня получилось и да, вариант не оптимальный.

<?php
if($handle = opendir(__DIR__)){
    echo 'Выводим список файлов';
    echo '<br>';
    while(false !== ($file = readdir($handle))) {
        if($file != "." && $file != ".."){
            echo '"' . $file . '"' . '<br>';
        }
    }
    closedir($handle);
}

echo '<br>' . 'Создаём папки и выводим их';
for ($i = 0; $i <= 2; $i++)
if (!is_dir(__DIR__ . "/" . 'dir' . $i)){
    mkdir(__DIR__ . "/" . 'dir' . $i);
}
if($handle = opendir(__DIR__)){
    echo '<br>';
    while(false !== ($file = readdir($handle))) {
        if($file != "." && $file != ".." && is_dir($file)){
            echo '"' . $file . '"' . '<br>';
        }
    }
    closedir($handle);
}

//Удаляем ненужные папки
for ($i = 0; $i <= 2; $i++)
    if (is_dir(__DIR__ . "/" . 'dir' . $i)){
        rmdir(__DIR__ . "/" . 'dir' . $i);
    }

echo '<br>' . 'Находим наш скрипт и выводим его' . '<br>';
$file = fopen('./'.$_SERVER['PHP_SELF'], 'r'); //Здесь я не до конца понял, что сделал, но работает
echo '"' . './'.$_SERVER['PHP_SELF'] . '"' . '<br>';
while (!feof($file)) {
    echo fgets($file);
    echo '<br>';
}
fclose($file);
ivashkevich

По выводу содержимого файла, лучше так:

echo file_get_contents(__FILE__);

Остальное ок

dliashchenko
<?php
echo file_get_contents(__FILE__, null, null, 6, 1000) . "<br/>";

$scanDir = scandir(__DIR__);
foreach ($scanDir as $file){
    if(is_file($file)) {
        echo $file . "<br/>";
    }
}

foreach ($scanDir as $dir){
    if (is_dir($dir)){
        echo $dir . "<br/>";
    }
}
ivashkevich

Отлично

H3licoptero
Второе задание

$dir = __DIR__;
$displayDir = scandir($dir);
foreach ($displayDir as $file) {
    if(is_dir($file)) {
        echo $dir . '<br>';
    }
}
ivashkevich

Отлично

Самый понятный курс PHP
Онлайн-уроки в удобное время!
Начать бесплатно
Логические задачи с собеседований