20200401のPHPに関する記事は5件です。

?【PHP】逆順forループで文字列を読んでいく

環境

PHP 7.2.21

やりたいこと

単純な文字列を後ろから一文字ずつ読んで色々判定したいので
後ろから一文字ずつのforループを実装してみる

やったこと

forの開始位置をstrlen()で文字数取得し$i--で逆に回す
※マルチバイト文字に対応していないのでそこは別途なんとかしたい

forLoop.php
        // 対象の文字列
        $tmpString = 'eltociear_hoge';

        for ($i = strlen($tmpString) -1; $i > -1; $i--) {
            // 一文字を表示
            var_dump($tmpString[$i]);
        }

出力結果

string(1) "e"
string(1) "g"
string(1) "o"
string(1) "h"
string(1) "_"
string(1) "r"
string(1) "a"
string(1) "e"
string(1) "i"
string(1) "c"
string(1) "o"
string(1) "t"
string(1) "l"
string(1) "e"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

�【PHPで解いてみた】1章 C++入門 AtCoder Programming Guide for beginners (APG4b)

1.00.1はじめに

気づき

-atcoderの問題は開業が必須
-phpのコードを書くときは <php? ?>で囲む?>は省略可

動いたコード

<?php
  echo "Hello, world!\n";

1.00.2 プログラムの書き方とエラー

このセクションの問題では、エラー文が与らています。PHPでエラーを再現するのは大変なので回答は端折ります。

ポイント

エラーには3つの種類がある

  • コンパイルエラー・・・文法的に間違いがあり、プログラムは一切動作しない
  • 実行時エラー・・・内容で致命的なエラー(例)0で割り算をした時。実行時エラーが起きる直前までプログラムは動作するが、エラー以降は動かなくなる。
  • 論理エラー・・・プログラムは動作するが想定どおりに動かないもの
  • コンパイルエラー・・・文法的に間違いがあり、プログラムは一切動作しない

1.00.3 四則演算と優先順位

ポイント

  • 算術演算子には、優先順位がある
  • ()を用いて優先順位を操作

動いたコード

<?php
    echo (string)((100+1)*100/2)."\n";

1.004.変数と型

ポイント

  • 変数を用いることで汎用性が生まれる
  • PHPは、型を宣言がない
  • 文字列型(string), 整数型(integer), 浮動小数点数型(float)(double), 論理型(boolean), 配列型(array), オブジェクト型(object), リソース型(resource), NULL(null)

動いたコード

<?php
    $seconds = 365 * 24 * 60 * 60;
    echo (string)1*$seconds."\n";
    echo (string)2*$seconds."\n";
    echo (string)5*$seconds."\n";
    echo (string)10*$seconds."\n";

1.005.実行順序と入力

ポイント

  • 1文字ならfgets(STDIN)
  • 1行で複数の値を入力として扱いたい時はfscanf()が便利

動いたコード

<?php
    fscanf(STDIN,"%d %d ",$a,$b);
    echo (string)$a+$b."\n";

1.00.6

ポイント

  • if文を用いた条件分岐は、if,elseif,elseを組み合わせて作る。
  • elseifが複数ありかつ複数の条件が満たされている時は、より上位のelseifが優先される。

EX6.電卓を作ろう

<?php
fscanf(STDIN,"%d %s %d ",$a,$op,$b);

if($op == "+"){
    echo ($a+$b)."\n";
}elseif($op == "-"){
    echo $a-$b."\n";
}elseif($op == "*"){
    echo $a*$b."\n";
}elseif($op == "/" && $b != 0){
    echo floor($a/$b)."\n";
}else{
    echo "error\n";
}

つまずいた所

  • 恒例の改行文字忘れ。

  • 0で割り算することを許容してしまう。

  • 少数の切り捨て忘れ。

関数 書式 用途
floor floor(数値) 切り捨て
ceil ceil(数値) 切り上げ
round round(数値,[,桁数]) 四捨五入

1.007.条件式の結果とbool型

ポイント

  • bool型はtrueとfalseのための型
  • C++では、trueの代わりに1, falseの代わりに0を用いることもできるがPHPでは出来ない。

EX7.bool値パズル

<?php
$a = true;
$b = false;
$c = true;

if ($a) {
echo "At";
}
else {
echo  "Yo";
}

if (!$a && $b) {
echo "Bo";
}
else if (!$b || $c) {
echo  "Co";
}

if ($a && $b && $c) {
echo "foo!";
}
else if (true && false) {
echo "yeah!";
}
else if (!$a || $c) {
echo "der";
}


echo "\n";

1.008.変数のスコープ

ポイント

  • { }で囲われた部分のところをブロックという
  • 変数が使える範囲のことをスコープという
  • 変数のスコープは「変数が宣言されてからそのブロックが終わるまで」
  • スコープが重なっている場合は最も内側のブロックで宣言された変数が選ばれる

つまずいた所

  • {}ブロックの外で変数定義($price=0; $text="";)をしていないことによる、最後のecho(echo $text."!"."\n";)で変数が定義されていないエラーが出る。
  • fgets(STDIN)は改行文字が入るので注意。

EX8.たこ焼きセット

<?php


$p = fgets(STDIN);

$price=0;
$text="";

if($p==1) {
    $price = fgets(STDIN);
}elseif($p==2){
//     $text = fgets(STDIN);
    fscanf(STDIN,"%s",$text);
    $price = fgets(STDIN);
}

$N = fgets(STDIN);

if($p==2){
    echo $text."!"."\n";
}
echo $price*$N."\n";

1.009.複合代入演算子

複合代入全くせずにといてしまいました。セクションの参考にはならないプログラムですw

ポイント

  • $a = $a + $bを$a += $bに省略できる。
  • PHPでは、$a .= $bで文字結合ができる。

EX9.複合代入演算子を使おう

<?php
fscanf(STDIN,"%d %d %d",$x,$a,$b);
echo ++$x."\n";
echo $x*($a+$b)."\n";
echo (($x*($a+$b))*($x*($a+$b)))."\n";
echo (($x*($a+$b))*($x*($a+$b))-1)."\n";

1.010. while文

ポイント

  • 無限ループに陥るので、カウンタ変数のインクリメントし忘れに注意。

EX10 - 棒グラフの出力

<?php

fscanf(STDIN,"%d %d", $a,$b);

$i = 0;

echo "A:";
while($i<$a){
    echo "]";
    $i ++;
}

echo "\nB:";
$i=0;
while($i<$b){
    echo "]";
    $i ++;
}
echo "\n";

1.011.for文・break・continue

ポイント

EX11.電卓をつくろう2

<?php
fscanf(STDIN,"%d",$n);
//    $ini = trim(fgetc(STDIN));
fscanf(STDIN,"%d",$ini);

$result = array();
$flag = false;

for($i=1;$i<=$n;$i++){
    fscanf(STDIN,"%s %d", $cal, $value);

    if($cal == "+"){
        $ini += $value;
        echo "${i}:".$ini."\n";
    }elseif($cal == "-"){
        $ini -= $value;
              echo "${i}:".$ini."\n";
    }elseif($cal == "*"){
        $ini *= $value;
              echo "${i}:".$ini."\n";
    }elseif($cal == "/" && $value != 0){
       $ini /= $value;
      $ini = (int)$ini;

              echo "${i}:".$ini."\n";
    }else{
        echo "error\n" ;
        break;
    }
    $result[] = floor($ini);
}

1.012.文字列と文字

C++とPHPの比較

動作目標 C++ PHP
文字列の長さを取得 文字列変数.size() strlen($str)
i文字目にアクセス 文字列変数.at(i) 文字列[i]

EX12.足したり引いたり

<?php
    $S = trim(fgets(STDIN));
    $result = 1;

    for($i=1;$i<strlen($S);$i++){
        if($S[$i] == "+"){
            $result ++;
        }elseif($S[$i] == "-"){
            $result --;
        }
    }

    echo $result."\n";

1.013.配列

C++とPHPの比較

動作目標 C++ PHP
配列の長さを取得 配列変数.size() count(配列)
配列のi番目にアクセス 配列変数.at(i) 配列[i]

ポイント

  • PHPで文字列を分割する方法 explode(区切り文字, 文字列)
  • PHPで絶対値をとる方法 abs(数値)

EX13 - 平均との差

<?php


    $N = trim(fgets(STDIN));

    $A_n = trim(fgets(STDIN));

    $scores = explode(" ", $A_n);

    $sum_scores = 0;

    #平均値を求める
    for($i=0;$i<$N;$i++){
        $sum_scores += $scores[$i];
    }

    $average_scores = (int)($sum_scores/$N);

    for($i=0;$i<$N;$i++){
        echo abs(($scores[$i]-$average_scores))."\n";
    }

1.014.STLの関数

C++とPHPの比較

  • C++が引数と戻り値の型を指定しないといけないが、PHPはその必要がない。

EX14.三人兄弟の身長差

<?php

    fscanf(STDIN,"%d %d %d", $a, $b, $c);

    echo (max($a,$b,$c)-min($a,$b,$c))."\n";

1.015.関数

C++とPHPの比較

  • PHPの関数定義: function 関数名(){ }
  • 1.014でも記したが、C++とは異なり、PHPは引数と戻り値の方を指定しなくて良い。

EX15.三人兄弟へのプレゼント

<?php
    $N = trim(fgets(STDIN));

    $A = trim(fgets(STDIN));
    $A_tests = explode(" ",$A);

    $B = trim(fgets(STDIN));
    $B_tests = explode(" ",$B);

    $C = trim(fgets(STDIN));
    $C_tests = explode(" ",$C);

    function sum($n,$b_tests){
        $sum_test = 0;
        for($i=0;$i<$n;$i++){
            $sum_test += $b_tests[$i];
        }
        return $sum_test;
    }

    function output($sum_a,$sum_b,$sum_c){
        $sum_everyone = $sum_a*$sum_b*$sum_c;
        echo $sum_everyone."\n";
    }

    $result_A = sum($N,$A_tests);
    $result_B = sum($N,$B_tests);
    $result_C = sum($N,$C_tests);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【WAMP】WindowsとApacheとMysqlとPhpと

概要

仕事のために試したことをまとめたものです。
Apacheがwin64、PHPがwin32だとうまくいかなかったのでMySQLも統一の必要があるかもしれません。

バージョン

  • Apache:httpd-2.4.41-win32-VS16.zip
  • MySQL:mysql-8.0.19-winx64.zip
  • PHP:php-5.4.45-Win32-VC9-x86.zip

インストール

各アプリケーションのインストールから実行までの手順を記載

Apache

  1. ファイルをダウンロードし展開(C:\Apache24)
  2. httpd.confに以下を追記
    1. http://localhost/でアクセス可能に:ServerName localhost:80
    2. PHPのディレクトリを指定:PHPIniDir "c:/php"
    3. .phpファイルをPHPとして実行可能に:AddType application/x-httpd-php .php
    4. apache2.4用PHP5モジュールをロード:LoadModule php5_module "c:/php/php5apache2_4.dll"
    5. URL書き換えのためにmod_rewriteをロード:LoadModule rewrite_module modules/mod_rewrite.so
    6. .htaccessでの設定を可能に:<Directory />配下にAllowOverride All
  3. htdocsに.htaccessを作成し以下を記述
    1. URLの書き換えを有効にする:RewriteEngine on
    2. 書き換え後のパスのベースURLを指定:RewriteBase /
    3. 書き換えの条件を指定
      1. ファイルではない時:RewriteCond %{REQUEST_FILENAME} !-f
      2. ディレクトリではない時:RewriteCond %{REQUEST_FILENAME} !-d
    4. 書き換えのルールを指定(条件に一致する全てのパスをクエリをマージしてindex.phpにforward):RewriteRule ^ index.php [QSA,L]
  4. コマンドプロンプトを管理者として実行
  5. apacheを起動:httpd -k start

MySQL

MySQLインストール参考サイト(Qiita記事)

  1. 上記サイト手順6まで実行
  2. PATHを通す([展開先]\bin)
  3. MySQL初期化:mysqld --initialize-insecure --user=mysql
  4. .batファイルを作成し次の内容で保存:mysqld --defaults-file="[展開先]\my.ini" --console
  5. 接続:mysql -u root --skip-password
  6. rootユーザにパスワード設定:ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

PHP

  1. ファイルをダウンロードし展開(C:\php)
  2. php.ini-productionをコピペしphp.iniを作成
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel ユーザIDを取得しようとしたらエラーが出た話

目的

  • 初歩的であるがこれからもうっかり発生させそうなエラーなので解決方法を含めてまとめる

実施環境

  • ハードウェア環境
項目 情報 備考
OS macOS Catalina(10.15.3)
ハードウェア MacBook Air (11-inch ,2012)
プロセッサ 1.7 GHz デュアルコアIntel Core i5
メモリ 8 GB 1600 MHz DDR3
グラフィックス Intel HD Graphics 4000 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いて導入
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

エラー内容

  • 下記の手順にしたがってAuthによるログイン機能を実装した。
  • コントローラで現在ログインしているユーザのユーザIDを取得し紐づいているビューファイルで表示する処理を記載した。
  • 下記にコントローラの内容を記載する。(名前領域userにあるhome.blade.phpのビューファイルを呼び出している。)

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    
    class UserController extends Controller
    {
        public function home() {
            $user_id = Auth::id();
            return view('user.home', compact('user_id'));
        }
    }
    
  • ブラウザで確認したところ下記のエラーが出力された。

    • 「Error Class 'App\Http\Controllers\Auth' not found」

      スクリーンショット 2020-03-30 13.58.24.png

  • not foundと言われているので確認してもAuthディレクトリは存在していた。

原因

  • コントローラにてAuth::id();を用いてログイン中のユーザIDを取得する場合は当該コントローラの冒頭に下記の記載がないとユーザIDを取得するとこはできない。

    use Auth;
    

解決方法

  1. コントローラのの冒頭部分にuse Auth;の記載を追加する。

    • 下記に追加したあとのコントローラファイルの例を記載する。

      <?php
      
      namespace App\Http\Controllers;
      
      use Illuminate\Http\Request;
      
      //下記の内容を追記する
      use Auth;
      
      class UserController extends Controller
      {
          public function home() {
              $user_id = Auth::id();
              return view('user.home', compact('user_id'));
          }
      }
      
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

本日の学習内容part5

書籍での学習を始めます

PHPをProgateドットインストールUdemyである程度学習しましたので、一度フレームワークというものを触ってみようという事で、先週末にPHPフレームワークLarabel入門第2版を買ってきました。

今日した事

・composerのインストール
 やり方は端折ります。が、ネット上にも情報が転がってましたので、リンク貼っておきます。【PHP】Composerは絶対必要!インストール方法と解説で完全攻略

・Laravelのインストール
 こちらもやり方を端折ります。(著作権侵害こわひ。) こちらもネット上のやり方リンク貼っておきます。導入手順を解説!Laravelのインストール方法【初心者向け】

・XAMPPのインストール
 本には載ってなかったですが(もうすでに導入が終わってるつもりで進めてる?)、これも行います。よくみたら書いてありました。ごめんなさい。これもリンク貼り->XAMPP インストールと動かす手順(Windows10)

さあ、これからフレームワークを学習していきます。また次回。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む