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;
}

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

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2011/12/30 11:42:10
  • 終了:2012/01/04 11:14:46

ベストアンサー

id:TransFreeBSD No.5

TransFreeBSD回答回数668ベストアンサー獲得回数2682011/12/31 21:15:45

ポイント40pt

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

<?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使うとか、よその部分の流れで決めるとか、気分とか。

id:kyouryukun

詳しいご回答ありがとうございます。
大変参考になりました!

2012/01/04 10:57:08

その他の回答(5件)

id:m-ohshita No.1

ohshita回答回数3ベストアンサー獲得回数12011/12/30 12:03:14

ポイント10pt

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

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
他2件のコメントを見る
id:m-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
2011/12/30 12:19:27
id:kyouryukun

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

2011/12/31 19:25:36
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492011/12/30 12:26:36

ポイント20pt

とりあえず例を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) . '];');
    }
}
他4件のコメントを見る
id:kyouryukun

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

2011/12/31 19:27:13
id:TransFreeBSD

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

2011/12/31 20:46:57
id:HowAreYou No.3

HowAreYou回答回数91ベストアンサー獲得回数172011/12/30 12:36:37

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

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

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

2011/12/31 19:32:56
id:kodairabase No.4

kodairabase回答回数661ベストアンサー獲得回数802011/12/30 12:44:27

ポイント10pt

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

<?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;

?>

id:kyouryukun

2つもご回答していただきありがとうございます。
2つとも試させていただきます。

2011/12/31 19:37:30
id:TransFreeBSD No.5

TransFreeBSD回答回数668ベストアンサー獲得回数2682011/12/31 21:15:45ここでベストアンサー

ポイント40pt

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

<?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使うとか、よその部分の流れで決めるとか、気分とか。

id:kyouryukun

詳しいご回答ありがとうございます。
大変参考になりました!

2012/01/04 10:57:08
id:tobeoscontinue No.6

tobeoscontinue回答回数214ベストアンサー獲得回数542011/12/31 21:35:54

ポイント10pt

可変変数(既出http://php.net/manual/ja/language.variables.variable.php)と
連想配列からローカル変数を生成するextract(http://jp.php.net/manual/ja/function.extract.php)が使えます。

$animal=array("いぬ", "ねこ","インコ");
foreach ($animal as $id=>$value) {
  $name = 'animal'.($id+1);
  $$name = $value;
}

注意:シーケンシャルな番号として配列の添字($id)を使っていますが場合によっては違うこともあるので明示的にした方がいいかもしれません。


$animalを連想配列にすることができるのであればextractするだけなので便利です。
そうでない場合は一旦$animalを連想配列にしてextractすることになります。

$names = array();
foreach ($animal as $id=>$value)
  $names[] = 'animal'.($id+1);
$animal_h = array_combine($names, $animal);
//$animal_h = array('animal1'=>"いぬ", 'animal2'=>"ねこ",'animal3'=>"インコ");
extract($animal_h);

?>

id:kyouryukun

少し難しく感じましたが、なんとか試してみます。
ご回答ありがとうございます。

2012/01/04 10:55:53
  • id:Cherenkov
    TransFreeBSDさんの回答を参考に。array_padとlistがミソ。
    $animal = array("いぬ", "ねこ");
    $animal = array_pad($animal, 3, 0);
    list($animal1, $animal2, $animal3) = $animal;
    echo $animal1; //"いぬ"
    echo $animal2; //"ねこ"
    echo $animal3; //0

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません