人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPの配列内の値を変数に代入する方法が知りたいです。

$animal=array("いぬ", "ねこ","インコ");
という配列を作りました。
その配列の値は常に3個の値が入っているわけではなく、
$animal=array("いぬ", "ねこ");
$animal=array("いぬ");
だったりします。

配列の値を変数に代入するために最初は、

echo $animal1 =$animal[0];
echo $animal2=$animal[1];
echo $animal3=$animal[2];

とコードを書きました。
しかしこれだと、配列に1つしか値が入っていないケースだと
他の2つの変数に対し「Undefined offsetエラー」が出てしまいます。

次にこのエラーを消去するために、下記のコード3つ書きました。

//値が存在するなら
if (isset($animal[0])) {
//変数値を代入
$animal1 =$animal[0];
} else {
//ないならnullを代入
$animal1=null;
}

これでエラーが出なくなったのはいいのですが、コードが長すぎてあまりしっくりしません。
この処理を短くまとめることができるのであれば、方法を教えていただけないでしょうか?
よろしくお願いします。。

●質問者: ぱんたま
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● ohshita
●10ポイント

たとえばこんな関数を用意してみてはいかがでしょうか。

function ifset($expr1, $expr2 = NULL) {
 if (isset($expr1))
 return $expr1;
 else
 return $expr2;
}

もし1番目の引数が未定義の変数だった場合には、2番目の引数で指定した値(省略時はNULL)が返ってきます。

$animal = array("いぬ", "ねこ");
$animal1 = ifset($animal[0]); // "いぬ"
$animal2 = ifset($animal[1]); // "ねこ"
$animal3 = ifset($animal[2]); // NULL

ohshitaさんのコメント
あ、これだとエラー出ちゃいますね。

ぱんたまさんのコメント
ご回答ありがとうございます。 他に方法が思いつくのであれば、お願いします。

ohshitaさんのコメント
配列に特化するとこんな実装ができますね。 >|| function array_ifset($expr1, $index, $expr2=NULL) { if (array_key_exists($index, $expr1)) return $expr1[$index]; else return $expr2; } $animal = array("いぬ", "ねこ"); $animal1 = array_ifset($animal, 0); // "いぬ" $animal2 = array_ifset($animal, 1); // "ねこ" $animal3 = array_ifset($animal, 2); // NULL ||<

ぱんたまさんのコメント
再度のご回答そありがとうございます。 こんな方法があるんですね。試してみます。

2 ● うぃんど
●20ポイント

とりあえず例を3つほどあげておきますが、
たいていの処理は、配列のままで扱ったほうが楽だったりします

何のために個別の変数に入れなければならないのか知りませんが、
個別の変数にする必要が本当にあるのかについては再考の余地があるでしょう

(1)switchを使った例
コードとしては一番見やすいかもしれない

<?php
$animal=array("いぬ", "ねこ","インコ");

$animalCount = count($animal); # 何度もcountするのは無駄なので先に行っておく
switch (true) {
 case ($animalCount >= 3): $animal3 = $animal[2];
 case ($animalCount >= 2): $animal2 = $animal[1];
 case ($animalCount >= 1): $animal1 = $animal[0];
}

(2)3項演算子を使った例
こまめな変更にも対応できるけれど、
似たような事を何度も繰り返すのはコードの間違いを見つけ難い

<?php
$animal=array("いぬ", "ねこ","インコ");

$animal3 = (isset($animal[2]) ? $animal[2] : '');
$animal2 = (isset($animal[1]) ? $animal[1] : '');
$animal1 = (isset($animal[0]) ? $animal[0] : '');

(3)evalを使った例
phpでphpのコードを生成できてしまうeval
一見すると非常に便利なのだけど、
php上級者でもプログラムをミスする可能性が高く、
非常手段的なものとなります

<?php
$animal=array("いぬ", "ねこ","インコ");

if( ($animalCount = count($animal)) > 0 ) {
 for($i = 1; $i < $animalCount; $i++) {
 eval('$animal' . $i . ' = $animal[' . ($i - 1) . '];');
 }
}

ぱんたまさんのコメント
変数に代入する理由は、 その配列の値をデータベース上のテーブルに追加したいがためです。 >|| <input type="text" name="animals[]" vlue="いぬ"> <input type="text" name="animals[]" vlue=""> <input type="text" name="animals[]" vlue=""> ||< INSERT INTO Aテーブル(animal1,animal2,animal3 ) VALUES( $animal1,$animal2, $animal3 ) という具合にデータがあるときだけテーブルに追加します。 windofjuly さんのおおしゃっることを踏まえると、配列内の値ををテーブルに追加するさいには上記のようなやり方をしないほうがいいかもしれませんね。 >|| <input type="text" name="animal1" vlue="いぬ"> <input type="text" name="animal2" vlue=""> <input type="text" name="animal3" vlue=""> ||< というようにしたほうがいいのかな?

うぃんどさんのコメント
HTMLに関しては、どちらが良いというものではないですが、 JAVAScriptなどで操作するなども視野に入れているならば、 前者( animals[] )のままのほうが便利かもしれませんね さて、指摘点はそこではなく、 php側で配列変数からスカラー変数に入れ込む必要があるのかという点です データベースに書き込むSQLを生成するなら、 例えば、下記のような具合にすればいいだけですから・・・ >|php| $SQL = "INSERT INTO Aテーブル(animal1,animal2,animal3) VALUES('" . (isset($animal[0]) ? mysql_real_escape_string($animal[0]) : '') . "','" . (isset($animal[1]) ? mysql_real_escape_string($animal[1]) : '') . "','" . (isset($animal[2]) ? mysql_real_escape_string($animal[2]) : '') . "')"; ||<

TransFreeBSDさんのコメント
個人的には、配列に空文字入れておく方が好きです。 >|php| for($i = count($animal); $i < 3; $i++) { $animal[$i] = ''; } ||< と書いて、もしかしてと思って調べたら、ちゃんとそういう関数ありました。 http://www.php.net/manual/ja/function.array-pad.php >|php| $animal = array_pad($animal, 3, NULL); ||<

うぃんどさんのコメント
>配列に空文字入れておく方が好き どうして、回答にしないのでしょう? この質問への一番直球な答えでベストアンサーだと思いますよ 私の挙げた例は、即座に効く薬ではありませんしね(苦笑)

ぱんたまさんのコメント
コメントでのご回答ありがとうございます。 その方法を試させていただきます。

TransFreeBSDさんのコメント
>どうして、回答にしないのでしょう? すみません。この質問自体からちょっと外れるなと思いつつも、「配列のままで扱ったほうが楽だったりします」に同感だったので書いておこうと思って、書いてから「回答のほうが良いのかな?」とかも思ったけれど、眠かったのでまあいいか的に(^^; ということで、改めて回答に書かせていただきますのでよろしくお願いします。

3 ● HowAreYou
●10ポイント
<?php
$animal = array("いぬ", "ねこ","インコ") ;

for ($i = 0; $i < count($animal); ++$i) ${'animal'.($i+1)} = $animal[$i] ;

ぱんたまさんのコメント
ご回答ありがとうございます。 この方法を試させていただきます。

4 ● kodairabase
●10ポイント

配列の要素の数だけ変数に代入したいなら

<?php
$animal = array("いぬ", "ねこ","インコ");
foreach ($anima as $i=>$val) ${'animal' . ($i + 1)} = $val;
?>

常にn個の変数に代入したいなら(配列にないものはnull)

<?php
$n = 5;
$animal = array("いぬ", "ねこ","インコ");
for ($i = 0; $i < $n; $i++)
 ${'animal' . ($i + 1)} = isset($animal[$i]) ? $animal[$i] : null;

?>


ぱんたまさんのコメント
2つもご回答していただきありがとうございます。 2つとも試させていただきます。

5 ● TransFreeBSD
●40ポイント ベストアンサー

他のコメントを読んで配列のままでも対応可能なのと、前処理としても使えるので、配列に空文字入れておく方法を。

<?php
for($i = count($animal); $i < 3; $i++) {
 $animal[$i] = '';
}

と書いて、もしかしてと思って調べたら、ちゃんとそういう関数ありました。
http://www.php.net/manual/ja/function.array-pad.php

$animal = array_pad($animal, 3, NULL);

こういう程度だと効率とか考えるほどではないので、好みとか分かり易さかなと思います。
上記も後者だと、array_padの"pad"の意味がパッと出てくるようなら分かり易いけれど、そうでないなら前者の方が分かり易いかなと。あと、この処理もその一つだけれど、他にバリデーションとかmysql_real_escape_stringとかが必要なら同様にループで回すのもありかと。
で、これも好みで分かれて、

<?php
for($i = 0; $i < 3; $i++) {
 $animal[$i] = isset($animal[$i]) ? mysql_real_escape_string($animal[$i]) : '';
}
<?php
for($i = 0; $i < count($animal); $i++) {
 $animal[$i] = mysql_real_escape_string($animal[$i]);
}
for($i = count($animal); $i < 3; $i++) {
 $animal[$i] = '';
}

あと、長い3項演算子は読みにくいからif使うとか、array_mapとarray_pad使うとか、よその部分の流れで決めるとか、気分とか。


ぱんたまさんのコメント
詳しいご回答ありがとうございます。 大変参考になりました!

1-5件表示/6件
4.前の5件|次5件6.
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ