20200910のPHPに関する記事は9件です。

Laravelでcreateを実行してもカラムの値がNULLになってしまうときの解決策

問題

  • Laravelcreateを実行したが、値を指定したのに挿入される値はNULLになっていた。
  • Laravelcreateを実行した際、SQLSTATE[HY000]: General error: 1364 Field (カラム名) doesn't have a default valueが発生した。

解決策

モデルを見直す

自分の場合、モデルで該当のカラムを$fillableの対象に記入していなかった。

app\Model.php
class Model extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 
    //(ここにcreateを実行してもNULLになってしまっていたカラムを指定する)
    ];

原因

Laravelでは、モデルを通してcreateなどを利用しデータベースにレコードなどを保存する際、悪意あるユーザーが勝手にカラムなどを作成し、その人が実質上の管理者とならないように管理者を保護する機能が標準で備わっている。
そのため、$fillableなどでcreateで作成、挿入する対象のカラムを指定しないと、Laravelが悪意あるユーザーかもしれないと思ってしまい、自動でNULLを入れて保護してしまうことが原因だった。

createなどでデフォルトの値を設定していないカラムは、$fillableなどで保護するのを忘れないようにしよう!!

参考資料

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

Visual Studio CodeでPHPUnit実行時にXDebugを有効にする

やりたいこと

Install

設定 launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "port": 9000
    },
    {
      "name": "Launch currently open script",
      "type": "php",
      "request": "launch",
      "cwd": "${fileDirname}",
      "runtimeExecutable": "/usr/local/bin/php",
      "runtimeArgs": [
        "-d",
        "zend_extension=xdebug.so",
        "-d",
        "xdebug.remote_enable=1",
        "-d",
        "xdebug.remote_autostart=1",
        "-d",
        "xdebug.remote_host=localhost",
        "-d",
        "xdebug.remote_port=9001"
      ],
      "program": "${workspaceRoot}/vendor/bin/phpunit",
      "args": ["${file}"],
      "port": 9001,
      "log": false
    }
  ]
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Visual Studio Codeでも必要な時にのみXDebugをオン

やりたいこと

Install

設定 launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "port": 9000
    },
    {
      "name": "Launch currently open script",
      "type": "php",
      "request": "launch",
      "cwd": "${fileDirname}",
      "runtimeExecutable": "/usr/local/bin/php",
      "runtimeArgs": [
        "-d",
        "zend_extension=xdebug.so",
        "-d",
        "xdebug.remote_enable=1",
        "-d",
        "xdebug.remote_autostart=1",
        "-d",
        "xdebug.remote_host=localhost",
        "-d",
        "xdebug.remote_port=9001"
      ],
      "program": "${workspaceRoot}/vendor/bin/phpunit",
      "args": ["${file}"],
      "port": 9001,
      "log": false
    }
  ]
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

FuelPHPでのFacebookログインの実装

はじめに

わりと今さらですが、FuelPHP で Facebook ログインを実装した時のメモです。
FuelPHP では、Opauth というパッケージを使うことにより容易にソーシャルログインを実装することが可能です。

Facebookアプリを作成

これは FuelPHP に限った話ではないですが、Facebook の使ったソーシャルログインを実装するためには、まず Facebook 側でソーシャルログイン用の Facebook アプリを作成しておく必要があります。
Facebook アプリを作成するには Facebook の開発者登録が必要ですので、まずは開発者登録を行います。

開発者登録

開発者登録をしたいアカウントでFacebookにログインした状態で、下記のページにアクセスします。

https://developers.facebook.com/

ページの右上の「スタートガイド」をクリックすると登録用のウィンドウが出てきます。
あとは画面の案内通りに進めれば開発者登録が終わります。
ちなみに、開発者登録には電話番号認証もしくはクレジットカード認証が必要になりますので、どちらかを用意しておきます。

アプリ作成

開発者登録を行うと、https://developers.facebook.com/ のスタートガイドの部分が「マイアプリ」に変わります。
「マイアプリ」をクリックすると、Facebook アプリの作成画面に行くことができます。

ここで、作成したいアプリを選択して作成すると、アプリIDと secret が作成されます。
この2つが Facebook アプリを作成する上で必要となるので、どこかに記録しておきます。
(アプリの設定についても適宜行いますが、ここでは省きます)

FuelPHP 側の設定

Facebook アプリの作成が終われば、あとは FuelPHP側での対応を行えばOKです。
以降、FuelPHP-1.8.2 の例になります。

FuelPHP インストール

まずは、FuelPHP をインストールします。
やり方はなんでもいいですが、例えば下記のような感じで。
詳細は、各種 FuelPHP のインストールを解説しているページを参照ください。

% git clone --recursive git://github.com/fuel/fuel.git
% cd fuel
% php composer.phar update
% php oil refine install

以降、FuelPHP を /project/test1 以下にインストールしたこととします。

パッケージインストール

次に、Facebook ログインの実装に必要なパッケージをインストールします。
パッケージは Composer を使ってインストール可能なので、まずは下記のように composer.json に追記します。

composer.json
"opauth/opauth": "0.4.*",
"opauth/facebook": "dev-master",

下記のように Composer を一度 self-update しつつ、パッケージをインストールします。

% php composer.phar self-update
% php composer.phar update

設定

まず、config.php を下記のように設定して、auth パッケージを有効化します。

config.php
'always_load' => array(
        'packages' => array(
            'orm',
            'auth',
        ),
),

次に、packages/auth/config/opauth.phpapp/config/ 以下にコピーし、下記のように記録しておいた Facebook のアプリIDとsecret を記載します。
また、email 情報も取得したい場合には、デフォルトでは email 情報は得られないので、下記のように scope と fields も設定します。

opauth.php
'Strategy' => array(
        'Facebook' => array(
           'app_id' => '1111111111111111',
           'app_secret' => 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
         'scope' => 'email',
         'fields' => 'email,first_name,last_name,name',
        ),
),

DB作成

通常の FuelPHP 使用時と同様に、MySQL などの DB 環境を整備し、FuelPHP 側の設定を行います。
FuelPHPからDB接続ができる状態となったら、Opauth に必要なDBテーブルを作成するために、下記を実行します。

% php /project/test1/oil refine migrate --packages=auth

ここまでで設定関係は完了となります。

実装

ここまでで設定した内容を使って、Facebook ログインを実装します。
ここでは非常に簡単な例として、下記のようなサイトを作成します。

URL path 概要
/sample/index ログイン済みの時のみ表示可能とする(未ログインなら /user/login にリダイレクト)
/user/login Facebook ログインするためのリンクを表示
/user/auth/facebook Facebook ログイン

/sample/index

まずは、ログイン済みの時だけ表示可能な /sample/index を実装します。
手っ取り早く下記で generate します。

% php /project/test1/oil g controller sample index
Creating view: /project/test1/fuel/app/views/template.php
Creating view: /project/test1/fuel/app/views/sample/index.php
Creating controller: /project/test1/fuel/app/classes/controller/sample.php

app/views/sample/index.php はログイン済みの時に表示される内容なので、適当に表示したい内容に修正します。
app/classes/contoller/sample.php は、生成時の状態に before() を追加して、未ログイン時にログインページにリダイレクトするようにします。

app/classes/contoller/sample.php
<?php

class Controller_Sample extends Controller_Template
{
    public function before()
    {
        parent::before();
        if ( ! Auth::check())
        {
            Session::set_flash('error', 'no login');
            Response::redirect('user/login');
        }
    }

    public function action_index()
    {
        $data["subnav"] = array('index'=> 'active' );
        $this->template->title = 'Sample » Index';
        $this->template->content = View::forge('sample/index', $data);
    }

}

/user/login

次に、ログインするためのリンクを表示する /user/login を実装します。
未ログインの場合には、このページにリダイレクトされてきます。
こちらも、手っ取り早く下記のように generate します。

% php /project/test1/oil g controller user login
Creating view: /project/test1/fuel/app/views/user/login.php
Creating controller: /project/test1/fuel/app/classes/controller/user.php

app/views/user/login.php は、Facebook ログインする際には /user/auth/facebook に遷移させるようにします。
下記は、単にリンクだけを置く例です。

app/views/user/login.php
<ul class="nav nav-pills">
    <li class='<?php echo Arr::get($subnav, "login" ); ?>'><?php echo Html::anchor('user/auth/facebook','Facebookでログインする');?></li>
</ul>

app/classes/controller/user.php は、とりあえず /user/login については特に何も手を入れなくてもOKです。

/user/auth/facebook

今回の本題となる Facebook ログインを実装します。
基本的には、下記の公式ドキュメントの通りに実装すれば問題ありません。
http://fuelphp.jp/docs/1.8/packages/auth/examples/opauth.html

今回は、/user/auth/facebook という path なので、app/classes/controller/user.php に Facebook ログインのコードを実装していきます。

action_auth()

まず、/usr/auth/facebook の path に直接関係する action_auth() メソッドを実装する必要がありますが、このメソッドはドキュメントの通り下記の内容でOKです。

app/classes/controller/user.php
public function action_oauth($provider = null)
{
    // 呼び出すための OAuth プロバイダを持っていない場合は出て行く
    if ($provider === null)
    {
        \Messages::error(__('login-no-provider-specified'));
        \Response::redirect_back();
    }

    // Opauth の読み込み、プロバイダのストラテジーを読み込みプロバイダにリダイレクトするでしょう
    \Auth_Opauth::forge();
}

コメントに書かれている通り、有効な provider (今回であれば facebook)が指定された場合には、\Auth_Opauth::forge() により、指定された provider のページにリダイレクトされます。

action_callback()

action_callback() は、Facebook のページでログイン後にコールバックされるメソッドです。
ここで、Facebook での認証結果を取得します。

app/classes/controller/user.php
public function action_callback() 
{
    try {
        $opauth = Auth_Opauth::forge(false);
        $status = $opauth->login_or_register();
        $url = 'sample/index';
        Log::warning("login_or_register:" . $status);
        switch ($status) {
            case 'linked':
                // ログイン済みでプロバイダはこのユーザーと関連付けられている
                break;
            case 'logged_in':
                // 既知のプロバイダへ関連付けられ、そのアカウントでログイン
                break;
            case 'register':
                // このプロバイダでのログインは関連付けられていないので、ローカルアカウントを作成する必要あり
                $url = "user/register";
                break;
            case 'registered':
                // このプロバイダでのログインは関連付けられていないが十分な情報が返されたので、ローカルアカウントを自動的に登録した
                break;
            default:
                // 状態を判定できず
          }
          Response::redirect($url);
    }catch(OpauthException $e) {
        // 認証失敗
    }catch(OpauthCancelException $e) {
        // 認証失敗(キャンセル)
    }
}

login_or_register() で認証結果を取得することができるので、これを使って判定します。
ここでは、linked / logged_in / registered の時にはログインが完了したことを示しているので、/sample/index にリダイレクトするようにしています。

register の時には、Facebook ログインは成功しているが、まだローカルアカウントと関連付けられていない(ローカルアカウントが作成されていない)状態なので、ローカルアカウントと関連付けるために /user/register にリダイレクトするようにしています。

action_register()

action_register() では、Facebook ログインの情報を関連付けつつローカルアカウントを作成する処理を行います。

app/classes/controller/user.php
public function action_register()
{
    if ($authentication = Session::get('auth-strategy.authentication', array()))
    {
        try
        {
            $user = Session::get('auth-strategy.user');
            $user_id = Auth::create_user(
                $user['email'],
                'dummy',
                $user['email'],
                Config::get('application.user.default_group', 1),
                array(
                    'fullname' => $user['name'],
                )
            );

            if ($user_id)
            {
                $opauth = Auth_Opauth::forge(false);

                // call Opauth to link the provider login with the local user
                $insert_id = $opauth->link_provider(array(
                    'parent_id' => $user_id,
                    'provider' => $authentication['provider'],
                    'uid' => $authentication['uid'],
                    'access_token' => $authentication['access_token'],
                    'secret' => $authentication['secret'],
                    'refresh_token' => $authentication['refresh_token'],
                    'expires' => $authentication['expires'],
                    'created_at' => time(),
                ));
                Auth::instance()->force_login((int) $user_id);

                Session::set_flash('success', __('login.new-account-created'));
                Response::redirect_back('calendar');
            }
            else
            {
                \Session::set_flash('error', __('login.account-creation-failed'));
            }
        }

        // catch exceptions from the create_user() call
        catch (SimpleUserUpdateException $e)
        {
            // メールアドレスが重複
            if ($e->getCode() == 2)
            {
                Session::set_flash('error', __('login.email-already-exists'));
            }

            // ユーザー名が重複
            elseif ($e->getCode() == 3)
            {
                Session::set_flash('error', __('login.username-already-exists'));
            }

            // これは起こり得ないが、ずっとそうとは限らない...
            else
            {
                Session::set_flash('error', $e->getMessage());
            }
        }
    }
    else
    {
        Session::set_flash('error', 'Failed to retrieve a user information from the provider.');
    }

    Response::redirect_back('user/login');
}

Session::get('auth-strategy.authentication') で認証情報が、Session::get('auth-strategy.user') でそれに紐づくユーザー情報が取得できます。
これらを使ってローカルユーザーを作成し、provider login と紐付けることをしています。

おわりに

ここまでの実装で、一通り Facebook ログインが機能することが確認できます。
一度流れが分かってしまえばかなり簡単に実装することができるので、いろいろと使えそうですね。
Opauth は存在は知っていましたが、面倒くさくてずっと放置していたのですが、もっと早く使っておけばよかったと思いました。
なお、Opauth は Facebook 以外にも Twitter や Google あたりには少なくとも対応しているようです。

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

fgetsとかSTDINとか標準入力がわからなくてPaizaスキルチェックを始められない方へ

はじめに

プログラミングを学び始めて、もっと実力を磨くために、問題集みたいなのないかなーと探してPaizaに辿り着いたまではいいものの、「標準入力?fgets?STDIN?何それ?」「標準入力の値の取得方法は下記ページのサンプルコードを参照ください。って言うから値取得・出力サンプルコード見たけど、意味不。」と、当初はDランクの問題ですら、60分以内に解けなかった僕が通ります。

私はPHPを学習しているので、PHP前提でこの記事を作成します。

上級者の方、ツッコミや補足情報あれば、ぜひお願いします。

標準入力

標準入力とは、ここでは、Paizaスキルチェックにおいて、Paiza側から渡されるデータのことです。現時点では、あなたのプログラムの整合性を確認するために、10パターンのデータを用意して、あなたが提出したプログラムをチェックします。そのデータはこの標準入力としてあなたのプログラムに読み込む準備をしておかなくてはなりません。

そこで必要なのが、fgets関数とSTDINというオブジェクト(モノ)です。

fgetsとは

fgetsは関数でPHP公式では、下記のように定義されています。

fgets — ファイルポインタから 1 行取得する

STDINとは

STDINは変数みたいなものです。

まずは1行めをきちんと取り出す

仮に、下記のようなデータが与えられたとします。最終行には改行があります。

1
2
3

この値を取得していくには、下記コードでできます。Paizaでも一番最初に既に用意されているコードですよね。当然ながら$input_lineは別に$iにしても同じです。

$input_line = fgets(STDIN);

出力結果↓

1

わかりづらいですが、1の後に改行が入っています。
これはよろしくないので、trim関数を使ってトリミングしてあげます。

trim — 文字列の先頭および末尾にあるホワイトスペースを取り除く

$input_line = trim(fgets(STDIN));

↑こうすると改行やスペースのない1が取り出せます。

複数行にまたがるデータを取り出す

1行めを取り出すのは簡単でしたが、では2行め以降はどのように取り出したらいいのでしょうか。
fgets関数は「ファイルポインタから 1 行取得する」ので、処理を繰り返すと2行目以降も取り出すことができます。

$a = trim(fgets(STDIN));
$b = trim(fgets(STDIN));
$c = trim(fgets(STDIN));
$d = trim(fgets(STDIN));

echo = $a; //1
echo = $b; //2
echo = $c; //3
echo = $d; //データなし

↑このように2回目のfgetsは2行めを取ってきます。

また、Paizaでは複数行にわたるデータの最初の行はデータ数を渡してきて、2行目からが実際に処理するデータであることが多いです。下記↓のような例です。(しつこいですが、最終行には改行が入ってます。)

3
1
2
3

↑データ自体は先ほどのデータと同じですが、1行めにデータ数の情報(データ3行あるよ〜)が挿入されています。この1行めの数字は、forやwhileの繰り返し構文の条件設定に使います。

$input_line = trim(fgets(STDIN)); //$input_lineには3が代入される

for($i=0; $i < $input_line; $i++) { //←繰り返しの条件設定に使う
 //処理したい内容をここに
}

↑こうすれば0, 1, 2と3回for内の処理が繰り返されることになります。

また、そこで当然ながらデータを使うことになると思いますので、fgets(STDIN)をfor文の中に書いていきます↓。

$input_line = trim(fgets(STDIN)); //$input_lineには3が代入される

for($i=0; $i < $input_line; $i++) {
 $a = trim(fgets(STDIN)); //もう上で一行目の3は使われているので、1から一行ずつ代入されていく
}

↑こうして、一行目のデータをデータ数として使用し、二行目以降を実際のデータとして取り出して料理していくわけですね。

ちなみにこちら↓がPaizaの値取得・出力サンプルコード、PHPバージョンです。引用します。こうして見ると最初の3行はわかりやすくなったのではないでしょうか??4行目からは取得したデータを問題に合わせてコーディングしているだけです。

2
2 5
3 4
$input_line = trim(fgets(STDIN));
for ($i = 0; $i < $input_line; $i++) {
    $s = trim(fgets(STDIN));
    $s = str_replace(array("\r\n","\r","\n"), '', $s);
    $s = explode(" ", $s);
    echo "hello = ".$s[0]." , world = ".$s[1]."\n";
}

最後に

超初歩的な内容ですが、自分が過去に躓いたポイントを頭の中が整理できました。誰かのお役に立てると幸いです。ご指摘もどうぞよろしくお願いします。

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

Laravelでneo4jを使ってみる②Loginをneo4jに対応してみる

※モデルファイルをapp/Models内に移動しています。
※参考【Laravel】モデルのディレクトリ構成変更についてのメモ

②ログイン機能を対応してみる

1)ログイン機能の有効化

下記コマンドをプロジェクトで実行

php artisan make:auth

2)User.phpの変更

app/Models/User.php※フォルダ構成変更していない場合はapp/User.php
<?php

namespace App\Models;

use Illuminate\Notifications\Notifiable;
//use Illuminate\Foundation\Auth\User as Authenticatable;

use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

use Vinelab\NeoEloquent\Eloquent\Model as NeoEloquent;

class User extends NeoEloquent implements
    AuthenticatableContract,
    AuthorizableContract,
    CanResetPasswordContract
{
    use Notifiable,Authenticatable, Authorizable, CanResetPassword;

    protected $label = 'User';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

【説明】
継承元の変更
元々UserクラスはLaravelフレームワークのAuthenticatableを継承していますが、こちらがNeoEloquentから派生していないため、
こちらで書き直しています。
モデルクラスがNeoEloquentから派生していない場合はエラーが発生します。

use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

use Vinelab\NeoEloquent\Eloquent\Model as NeoEloquent;

class User extends NeoEloquent implements
AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract

ラベルの設定
こちらを設定することで挿入されたデータのラベルがUserになります。
設定しない場合はAppModelsUserになりました。

protected $label = 'User';

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

Laravelでneo4jを使ってみる①設定編

①設定

・laravel バージョン 5.6
・neoEloquent バージョン 1.4.6

1)Laravelプロジェクトをバージョン指定して作成

composer create-project "laravel/laravel=5.6.*" [プロジェクト名]

2)Vinelab/NeoEloquentの設定

composer require vinelab/neoeloquent 1.4.6

※neo4jの設定がないと怒られる場合、先にconfig/database.phpの設定をしてキャッシュクリア。
 

3)neo4jデータベースの利用設定

config/database.phpにneo4jの設定を追加

    'default' => env('DB_CONNECTION', 'neo4j'),
   'connections' => [
       ~
       'neo4j' => [
            'driver' => 'neo4j',
            'host'   => env('DB_HOST', 'ホスト名'),
            'port'   => env('DB_PORT', '7474'),
            'username' => env('DB_USERNAME', "neo4jユーザ名"),
            'password' => env('DB_PASSWORD', "neo4jパスワード")
        ],

.envの設定を変更

DB_CONNECTION=neo4j
DB_HOST=ホスト名
DB_PORT=7474
DB_USERNAME=neo4jユーザ名
DB_PASSWORD=neo4jパスワード

参考
NeoEloquent

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

Amazon Linux 2 で PHP を簡単にアップデートする方法

Amazon Linux 2 の、ここ1年位の Amazon Linux Extra を使って、PHP をインストールしている人は、Amazon Linux Extra でパッケージの Disable & Enable をするだけで、結構簡単に PHP のアップデートができるという話です。

参考: Amazon linux 2でのphpの更新方法 (感謝!)

自分の環境

  • AWS
  • 開発用のサーバー
  • Amazon Linux 2
  • PHP 7.1 の Extra を導入
  • 導入済みの PHP 一覧 libmcrypt php php-bcmath php-cli php-common php-dba php-embedded php-enchant php-fpm php-gd php-gmp php-intl php-json php-ldap php-mbstring php-mysqlnd php-odbc php-opcache php-pdo php-pecl-igbinaryphp-pecl-mcrypt php-pecl-zip php-pgsql php-process php-pspell php-recode php-soap php-xml php-xmlrpc
  • この Ansible を使ってサーバーの初期構築をしています
    • Apache, MariaDB
    • concrete5 CMS を動かしています。
  • ec2-user などの sudo 権限のあるユーザーで実行

手順

  1. Amazon Extra の PHP7.1 を無効化: $ sudo amazon-linux-extras disable php7.1
  2. Amazon Extra の PHP7.3 を有効化: $ sudo amazon-linux-extras enable php7.3
  3. sudo yum update
    • 本当は PHP だけをアップデートするべきですが、開発なので、まとめて実行しました。もしも本番環境であれば、PHP だけを選択してアップデートするように走らせたらよいかと
    • 例: sudo yum update php*
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 配列の中の配列の値を書き換える方法

目的

  • 配列の中に入った配列の中の値を更新する方法をまとめる

実施環境

  • 下記サイトにてPHPの動作を確認しながら本記事を書いた。

  • 配列の中に入った配列の値を更新する処理を下記に記載する。

    foreach (配列A as &変数){
        変数['インデックス'] = '更新したい値';
    }
    

連想配列の既存インデックスのデータを書き換える具体例

  • 配列「$infos」には連想配列が格納されている物とする。
  • 連想配列にはインデックス「id」に商品IDが、インデックス「item_name」に商品名が、インデックス「price」に商品の税抜きの値段が格納されている物とする。
  • 配列「$infos」に格納されている連想配列のインデックス「price」の税抜き金額を引き出し、税率を用いた計算をし、連想配列のインデックス「price」の税抜き金額を税込み金額で書き換える方法を下記に記載する。

    <?php
    
    $infos[] = [
        'id' => 1,
        'item_name' => 'PHP book',
        'price' => '1000',
        ];
    
    $infos[] = [
        'id' => 2,
        'item_name' => 'Ruby book',
        'price' => '1200',
        ];
    
    foreach ($infos as &$info){
        $info['price'] *= 1.1;
    }
    
    var_dump($infos);
    
    ?>
    

連想配列に新規インデックスを追加する具体例

  • 配列「$infos」には連想配列が格納されている物とする。
  • 連想配列にはインデックス「id」に商品IDが、インデックス「item_name」に商品名が、インデックス「price」に商品の税抜きの値段が格納されている物とする。
  • 配列「$infos」に格納されている連想配列のインデックス「price」の税抜き金額を引き出し、税率を用いた計算をし、連想配列にインデックス「price_in_tax」を追加する方法を下記に記載する。

    <?php
    
    $infos[] = [
        'id' => 1,
        'item_name' => 'PHP book',
        'price' => '1000',
        ];
    
    $infos[] = [
        'id' => 2,
        'item_name' => 'Ruby book',
        'price' => '1200',
        ];
    
    foreach ($infos as &$info){
        $info['price_in_tax'] = $info['price'] * 1.1;
    }
    
    var_dump($infos);
    
    ?>
    

参考文献

foreach ($items as &$item){
    $item['id'] = 123;
};

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