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

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

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

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

Q&A

解決済

6回答

2855閲覧

PHP三項演算子で、値がないときはどうするのがいいでしょうか?

minorun

総合スコア1

PHP

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

0グッド

0クリップ

投稿2020/10/16 06:54

編集2020/10/16 06:56

前提・実現したいこと

引数を展開する際に、その値は必ずしもある、というわけではないですよね。

そういったときに三項演算子が便利と知り取り入れたのですが、値がないときはどうするのがいいか知りたいです。

コード規約があれば従うべきですが、個人開発の初心者につきそういったものはございませんので、皆様の方法を教えて頂きたく存じます。

初心者につき至らない点多々あるかと思いますが、どうぞよろしくお願い申し上げます。

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

以下hogeという関数でargsを受け取っています。

未定義や空文字に備え、これらの値の展開にあたって下記で三項演算子を使っていて、値がないときは``をセットするようにしました。

しかしoffsetは0がありえますので、nameやorder_byと同様にemptyで判定することができず、offsetだけ次のように複雑な書き方になってしまいました。

このような書き方はおかしいでしょうか。どうするのがいいか、アドバイス頂けましたら幸いです。

該当のソースコード

php

1<?php 2$args = [ 3 'name' => 'smith', 4 'order_by'=> 'created_at', 5 'offset' => 1, 6]; 7 8function hoges( $args ) { 9 // 展開 10 $name = !empty($args['name']) ? $args['name'] : ''; 11 $order_by = !empty($args['order_by']) ? $args['order_by'] : ''; 12 $offset = ( !empty($args['offset']) || ( isset($args['offset']) && $args['offset'] == 0 ) ) ? (int)$args['offset'] : ''; 13 14 // 展開した値を使い以下から色々な処理をやっていく 15}

試したこと

上記三つどれでも使える判定専用の関数を作ったらサッパリできると思ったのですが、未定義のときに「Undefined variable: v」のエラーとなってしまうために採用できませんでした。

php

1// 未定義、null、空文字のときにtrueを返す 2function my_is_empty( $v ) { 3 $is = false; 4 if ( !isset( $v ) ) { 5 $is = true; 6 } 7 if ( is_null( $v ) ) { 8 $is = true; 9 } 10 if ( $v === '' ) { 11 $is = true; 12 } 13 return $is; 14} 15 16// 実行すると未定義のときに「Undefined variable: v」のエラーとなってしまう 17$v = ''; // ok 18$v = null; // ok 19$v; // 機能しない 20var_dump( my_is_empty( $v ) );

補足情報(FW/ツールのバージョンなど)

レンタルサーバーの事情によりPHP var7.3.1 使用ですが、アップデートで楽になるならサーバーを変更しようと思っています。

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

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

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

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

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

guest

回答6

0

しかしoffsetは0がありえますので、nameやorder_byと同様にemptyで判定することができず

issetarray_key_existsを使いましょう。

投稿2020/10/16 07:01

maisumakun

総合スコア146018

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

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

minorun

2020/10/17 12:04

ありがとうございます。
guest

0

ベストアンサー

下の関数は未定義の場合でもif($v === '')まで行ってしまうのが原因だと思われますので
$isに代入せずにその時点でreturnすればいいように見えます。

今回のケースの場合は
Null合体演算子を使用してみてはどうでしょうか?

php

1$offset = $args['offset']??"";

で空の場合は空文字列が、0の場合は0が代入されると思います。

投稿2020/10/16 08:42

gogoweb_ikeda

総合スコア1426

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

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

minorun

2020/10/17 12:00

Null合体演算子、なるほどそれを知りたかったです。関数もありがとうございます。
guest

0

これは「要件次第」「設計次第」になります。
falseの時にどうしたいのか、その時の情報をどう扱うか
設計、要件で決めることになります。
場合により三項演算子ではないことが良い時もあります。

PHP var7.3.1 使用ですが、アップデートで楽になるなら

今のところ特にはないと思います。

投稿2020/10/16 06:59

m.ts10806

総合スコア80875

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

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

minorun

2020/10/17 12:04

ありがとうございます。
guest

0

個人開発でもフレームワークを使用するなら、フレームワークにバリデーションロジックが一般的には実装されているので、それを利用します。

フレームワークを使用しないなら、自身で好きなように実装しますが、可読性を高めるのであれば、
filter_var
を使用するとそこそこきれいに書けます。

使い慣れたフレームワークから、バリデーション用のクラスを移植するのも、後でメンテナンスしやすいです。

投稿2020/10/16 08:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

minorun

2020/10/17 12:04

ありがとうございます。
guest

0

PHP7.0で追加された??Null 合体演算子が求めてる機能だろう。
https://www.php.net/manual/ja/migration70.new-features.php

$name = $args['name'] ?? '';

強制したいならarrayではなく個別の引数にしたほうが良さそうだけど。

function hoges($name, $order_by = 'created_at', $offset = 1)

投稿2020/10/16 08:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

minorun

2020/10/17 12:04

ありがとうございます。
guest

0

直接的な回答に関しては既にあるもので行うことができるかと思うので、少し視点を変えて、、

一般的にはデータを挿入する際にバリデーションという形で必須項目やデータの整形は行います。その際に例えば必須でないものはそれに対してどの様に管理していくかを考える必要があります。NULLなのかデフォルトとして何か指定するのかなど。

そうすることにより展開する際の処理は削減することができます。

投稿2020/10/16 08:12

kai0310

総合スコア2076

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

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

minorun

2020/10/17 12:04

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問