質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

3回答

1382閲覧

phpのコードを読み解きたい

lilybelly

総合スコア19

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2020/02/09 08:05

前提・実現したいこと

PHP初心者です。
PHPで「フォルダから写真のファイルを読み込むコード」を読み解きたく、
PHPの学習サイトや参考書を見ながら解読しているんですが、
実際のコードを理解するのが難しいのでどなたかご教授いただきたいです。

発生している問題・エラーメッセージ

while(FALSE !== ($photo = $dire[$i]->read())){   if (mb_substr($photo, 0, 1) != '.' && mb_substr($photo, -3) == 'jpg') {     array_push($images, $photodirs[$i].$photo);   } }

の部分の「mb_substr($photo, -3) == 'jpg'」をなぜ−3にする必要があるのかわからなく困っています。
### 全体のソースコード

PHP

1 2 <section class="wrap"> 3 <nav class="side-nav"> 4 <ul> 5 <li> 6 <a href="index.php">Portfolio</a> 7 </li> 8 <li> 9 <a href="prof.php">Profile</a> 10 </li> 11 <li> 12 <a href="">Contact</a> 13 </li> 14 <li> 15 <a href=""><i class="fab fa-instagram"></i></a> 16 </li> 17 </ul> 18 </nav> 19 <main class="content"> 20 <ul class="masonry"> 21 22<?php 23 $dirName = 'photo/'; 24 $dir = dir($dirName); 25 $photodirs = array(); 26 $images = array(); 27 while(FALSE !== ($fileName = $dir->read())){ 28 if (mb_substr($fileName, 0, 1) != '.') { 29 array_push($photodirs, $dirName.$fileName.'/'); 30 } 31 } 32 33 for($i = 0 ; $i < count($photodirs); $i++) { 34 $dire[$i] = dir($photodirs[$i]); 35 36 while(FALSE !== ($photo = $dire[$i]->read())){ 37 if (mb_substr($photo, 0, 1) != '.' && mb_substr($photo, -3) == 'jpg') { 38 array_push($images, $photodirs[$i].$photo); 39 } 40 } 41 } 42 43 for($i = 0 ; $i < count($images); $i++){ 44 45 $s = intval (strpos( $images[$i], '/'))+1; 46 $e = intval (strrpos($images[$i], '/')) -intval ($s); 47 $pe = intval (strrpos($images[$i], '/'))+1 ; 48 $pim = mb_substr($images[$i], $pe); 49 $pim = mb_substr($pim, 0, -4); 50 $path = mb_substr($images[$i], $s, $e); 51 52 $imgin = getimagesize($images[$i]); 53 54 if($imgin[0]>$imgin[1]){ 55 echo '<li class="ms-tile s2"><a href="gallery.php?cat='.$path.'&img='.$pim.'"><img src="'.$images[$i].'"></a></li>'; 56 }else{ 57 echo '<li class="ms-tile"><a href="gallery.php?cat='.$path.'&img='.$pim.'"><img src="'.$images[$i].'"></a></li>'; 58 } 59 60 } 61?> 62 63 64 65 </ul> 66 67 </main> 68 </section> 69

取り出したいファイルの構成

![イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

mb_substr()の第二引数に負の整数を指定した場合、文字列の末尾から指定した数のバイト分切り出すことになります。

今回の場合だと、ファイル名の最後3バイトがjpgだったら処理を行うという感じの判断をしているのでしょう。

組み込み関数の挙動についてはPHPマニュアルを最初に参照するのがベストですので、まずは読んでみてください。
PHPマニュアル

投稿2020/02/09 08:13

編集2020/02/09 08:15
tanat

総合スコア18727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lilybelly

2020/02/09 08:29

わかりやすく回答していただきありがとうございます! ご教授いただきありがとうございます。 一番早く教えていただいたのでベストアンサーにさせていただきました。
guest

0

マイナスで指定すると「後ろから何文字」になるから。
後ろから3文字を見て拡張子がjpgかどうかを確認している。
https://www.php.net/manual/ja/function.mb-substr.php

投稿2020/02/09 08:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lilybelly

2020/02/09 08:19

わかりやすく回答していただきありがとうございます! 拡張子がjpgかどうかを確認しているのですね・・・! ご教授いただきありがとうございます。
guest

0

mb_substr

(PHP 4 >= 4.0.6, PHP 5, PHP 7)
mb_substr — 文字列の一部を得る

説明

mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] ) : string
文字数に基づきマルチバイト対応の substr() 処理を行います。位置は、 str の始めから数えられます。 最初の文字の位置は 0、2 番目の文字の位置は 1、といったようになります。

パラメータ

str
部分文字列を取り出したい文字列。

start

start が非負である場合に返される文字列は、 strstart バイト目以降の文字列となります (ゼロから数えます)。 たとえば、文字列 'abcdef' の 0 バイト目は 'a' で、 2 バイト目は 'c' のようになります。

start が負の数の場合に返される文字列は、 str の後ろから数えて start バイト目以降となります。

length

str の中から取り出す最大文字数。 省略したり NULL を渡したりした場合は、 文字列の最後までの全バイトを取り出します。

encoding

encoding パラメータには文字エンコーディングを指定します。省略した場合は、 内部文字エンコーディングを使用します。

返り値

mb_substr() は、start および length パラメータで指定した str の一部を返します。

引用元: PHP: mb_substr - Manual


start が負の数の場合に返される文字列は、 str の後ろから数えて start バイト目以降となります。

の記載のとおりです。 mb_substr('ファイル名.jpg', -3) としたとき、与えられた文字列 'ファイル名.jpg' の後ろから数えて 3バイト目移行を取得するので、得られる文字列は 'jpg' となります。

投稿2020/02/09 08:15

thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lilybelly

2020/02/09 08:28

丁寧に教えていただき誠にありがとうございます。 拡張子がjpgかどうか判定しているんですね! ご教授いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問