Php | memo-memo Skip to content

memo-memo

web制作に便利そうな情報をメモるブログ

Archive

Tag: php

配列のインデックスや、値を使って、一気に変数を定義するには、extract関数を使う。

<?php
$shapes = array(
'Sodacan' => 'Cylinder',
'Notepad' => 'Rectangle',
'Apple' => 'Sphere',
'Orange' => 'Sphere',
'Phonebook' => 'Rectangle'
);
extract($shapes);
//ここで、$Sodacan,$Notepad,$Apple,$Orange,$Phonebookがセットされる。
echo $Apple;
echo "<br />";
echo $Notepad;
?>

これをブラウザで表示させると、

Sphere
Rectangle

こうなる。

ただ、このままだと、連想配列でしか変数を作れない。

数値インデックスだと、変数0とか、変数1とかになってしまう。変数名の頭に数字は使えないので、

数値インデックスの配列をextract関数で変数にしたい時は、パラメーターを追加して、

接頭辞を付ける必要がある。

<?php
$shapes = array(
'Cylinder',
'Rectangle'
);
extract($shapes,EXTR_PREFIX_ALL,"shapes");
echo "shapes_0 is $shapes_0.<br />";
echo "shapes_1 is $shapes_1.";
?>

上記をブラウザで表示させれば、

shapes_0 is Cylinder.
shapes_1 is Rectangle.

が表示される。

赤字の、EXTR_PREFIX_ALLは、全ての変数に接頭辞を付けるって事。

青字のshapesは、接頭辞。

EXTR_PREFIX_ALL以外のパラメーターは、こちらを参照

多次元配列とは、配列の要素の中に配列が入っている状態。

配列が、多重に成っている配列を言う。

で、その定義の仕方は、配列の定義の記事で書いたarrayを多重にすれば良い。

$objects = array('Soda can'   => array('Shape'    => 'Cylinder',
                                       'Color'    => 'Red',
                                       'Material' => 'Metal'),
                 'Notepad'    => array('Shape'    => 'Rectangle',
                                       'Color'    => 'White',
                                       'Material' => 'Paper'),
                 'Apple'      => array('Shape'    => 'Sphere',
                                       'Color'    => 'Red',
                                       'Material' => 'Fruit'),
                 'Orange'     => array('Shape'    => 'Sphere',
                                       'Color'    => 'Orange',
                                       'Material' => 'Fruit'),
                 'Phonebook'  => array('Shape'    => 'Rectangle',
                                       'Color'    => 'Yellow',
                                       'Material' => 'Paper')
);

こんな感じ、まず一次元目に、「Soda can」、「Notepad」、「Apple」、「Orange」、「Phonebook」があって、

各々に、「Shape」、「Color」、「Material」が連想配列でくっついている(二次元目)。

で、この多次元の配列の出力は、下記の通り、

foreach ($objects as $obj_key => $obj){
 echo "$obj_key:<br />";
 while(list($key,$value) = each($obj)){
 echo "$key = $value ";
 }
 echo "<br />";
}

上記のコードをブラウザに表示させると、

Soda can:
Shape = Cylinder Color = Red Material = Metal
Notepad:
Shape = Rectangle Color = White Material = Paper
Apple:
Shape = Sphere Color = Red Material = Fruit
Orange:
Shape = Sphere Color = Orange Material = Fruit
Phonebook:
Shape = Rectangle Color = Yellow Material = Paper

こんな感じに出力される。

このコードは、サンプルをそのまま引っ張ってきたもので、当然サンプルだから、ちゃんと動くのだけど、

何故そうなるかの理解がまだいまいち…

赤文字のlist関数each関数の働きがちょっと微妙に解らなかったので、調べてみました。

list関数は、配列の値を、変数に一気に値を格納する働きがあるっぽい。下記は、こちらのページのサンプル。

<?php
$info = array('コーヒー', '茶色', 'カフェイン');
list($drink, $color, $power) = $info;
echo "$drink の色は $color で、$power が含まれています。";

?>

上記のコードを出力すると、

コーヒー の色は 茶色 で、カフェイン が含まれています。

となる。

「$drink」に「コーヒー」、「$color」に「茶色」、「$power」に「カフェイン」が各々格納されている。

一方each関数は、「配列から現在のキーと値のペアを返して、カーソルを進めます。」と書いてある。

 <?php
$foo = array("Robert" => "Bob", "Seppo" => "Sepi");
$bar = each($foo);
print_r($bar);
?> 

上記コードを出力すると、

Array
(
    [1] => Bob
    [value] => Bob
    [0] => Robert
    [key] => Robert
)
こんな感じに出力される。
[0]と[key]がキーで、[1]と[value]が値。
で、肝心の赤文字の意味ですが、
list($key,$value) = each($obj)という事は、
「変数$keyと$valueに配列each($obj)の値を格納している。」って事になる。
で、$keyと$valueをechoで出力している。while文の条件式に書かれているので、FALSEになるまで(最後まで)繰り返している。
うーん、この解釈で良いのだろうか???
オレオレ解釈…
each関数は、4つの要素を返すのに定義している変数が2つなのが、しっくりこない原因。
今度、詳しく調べてみよう。

配列をソートさせるには、sort関数を使用するとよさそう。

<?php
$fruit = array("orange","lemon","banana","apple");
sort($fruit);
foreach($fruit as $key => $val){
 echo "shapes[". $key ."] = ".$val."<br />";
}
?>

上記のコードをブラウザで表示させると、

shapes[0] = apple
shapes[1] = banana
shapes[2] = lemon
shapes[3] = orange

こんな感じで出力される。

sort関数には、省略可能な第二のパラメーターを渡す事が出来る。

詳しくはこちら

あと、インデックスと値の関係を保持したままソートしたい時(連想配列とかで、インデックスの値も欲しいとき)は、

assort関数を使うとよさそう。

配列の中の要素の数を取得するには、sizeof関数、もしくはcount関数を使う。

どうやらどちらでも同じっぽい。

$shapes = array('Soda can' => 'Cylinder',
 'Notepad' => 'Rectangle',
 'Apple' => 'Sphere',
 'Phonebook' => 'Rectangle');
$numElements = count($shapes);
$numElements2 = sizeof($shapes);
print "The array has $numElements elements.<br />";
print "The array has $numElements2 elements.<br />";
?>

上記のコードをブラウザで表示させると、

The array has 4 elements.
The array has 4 elements.

と、変数$numElementsも、変数$numElements2も、両方4が格納されている。

配列から要素を取得するには、インデックスを指定すれば良いのだけど、

どうやら文字列の中で配列を取得する場合は、若干注意が必要らしい。

{}で括らなきゃ成らないらしい。

$shapes = array('Soda can' => 'Cylinder',
 'Notepad' => 'Rectangle',
 'Apple' => 'Sphere',
 'Orange' => 'Sphere',
 'Phonebook' => 'Rectangle');

こんな配列があるとして、

print "A notepad is a $shapes[Notepad]";

は、「A notepad is a Rectangle」が出力される。

print "A notepad is a $shapes['Notepad']";

は、エラー。

print "A notepad is a {$shapes['Notepad']}";

は、「A notepad is a Rectangle」が出力される。

だったら、最初から、シングルクォートを使わなければいいんじゃん。って話だけど、

他の人のコードを読む時に解らなかったら困るので、一応メモ。