<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>@blog.justoneplanet.info &#187; 配列</title>
	<atom:link href="http://blog.justoneplanet.info/category/computer-language/php/array/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.justoneplanet.info</link>
	<description>日々勉強</description>
	<lastBuildDate>Wed, 08 Feb 2012 02:57:17 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>JavaScriptとPHPの配列の扱い</title>
		<link>http://blog.justoneplanet.info/2009/11/28/javascript%e3%81%a8php%e3%81%ae%e9%85%8d%e5%88%97%e3%81%ae%e6%89%b1%e3%81%84/</link>
		<comments>http://blog.justoneplanet.info/2009/11/28/javascript%e3%81%a8php%e3%81%ae%e9%85%8d%e5%88%97%e3%81%ae%e6%89%b1%e3%81%84/#comments</comments>
		<pubDate>Sat, 28 Nov 2009 04:01:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[配列]]></category>

		<guid isPermaLink="false">http://blog.justoneplanet.info/?p=3296</guid>
		<description><![CDATA[そういえば配列における「参照渡し」と「値渡し」の挙動がJavaScriptとPHPで異なっていたので書き留めておくことにする(・∀・)!! ■JavaScript 以下のようにJavaScriptでは、関数に配列を渡すと [...]]]></description>
			<content:encoded><![CDATA[<p>そういえば配列における「参照渡し」と「値渡し」の挙動がJavaScriptとPHPで異なっていたので書き留めておくことにする(・∀・)!!</p>
<h3>■JavaScript</h3>
<p>以下のようにJavaScriptでは、関数に配列を渡すと参照渡しとなる。</p>
<pre class="brush: jscript;">
var ary = ['a', 'b', 'c'];
var sample = function(ary){
    ary.pop();
}
console.log(ary);// ['a', 'b', 'c']
alert('sample');
sample(ary);
console.log(ary);// ['a', 'b']
</pre>
<p>ちなみにalertはconsoleが上手く作動しなかったために使用した。</p>
<h3>■PHP</h3>
<p>以下のようにPHPでは、関数に配列を渡すと値渡しとなる。</p>
<pre class="brush: php;">
$ary = array('a', 'b', 'c');
function sample($ary){
    array_pop($ary);
}
var_dump($ary);
sample($ary);
var_dump($ary);
</pre>
<p>JavaScriptと同じ挙動をPHPで再現するには以下のように記述する必要がある。</p>
<pre class="brush: php;">
$ary = array('a', 'b', 'c');
function sample(&amp;$ary){
    array_pop($ary);
}
var_dump($ary);
sample($ary);
var_dump($ary);
</pre>
<p>リソースを節約するには参照渡しを明示したほうがイイね（　＾ω＾）<br />
]]></content:encoded>
			<wfw:commentRss>http://blog.justoneplanet.info/2009/11/28/javascript%e3%81%a8php%e3%81%ae%e9%85%8d%e5%88%97%e3%81%ae%e6%89%b1%e3%81%84/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Arrays as Stacks, Queues and Set（スタック・待ち行列・和集合）</title>
		<link>http://blog.justoneplanet.info/2009/04/21/php-arrays-as-stacks-queues-and-set%ef%bc%88%e3%82%b9%e3%82%bf%e3%83%83%e3%82%af%e3%83%bb%e5%be%85%e3%81%a1%e8%a1%8c%e5%88%97%e3%83%bb%e5%92%8c%e9%9b%86%e5%90%88%ef%bc%89/</link>
		<comments>http://blog.justoneplanet.info/2009/04/21/php-arrays-as-stacks-queues-and-set%ef%bc%88%e3%82%b9%e3%82%bf%e3%83%83%e3%82%af%e3%83%bb%e5%be%85%e3%81%a1%e8%a1%8c%e5%88%97%e3%83%bb%e5%92%8c%e9%9b%86%e5%90%88%ef%bc%89/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 14:48:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[配列]]></category>

		<guid isPermaLink="false">http://blog.justoneplanet.info/?p=877</guid>
		<description><![CDATA[■スタック スタックとは 順列において、最初に挿入されたデータが最後に取り出される。最後に挿入したデータが最初に取り出されるデータ構造。LIFO（last in first out）と呼ばれる。 実際のコード 以下のよう [...]]]></description>
			<content:encoded><![CDATA[<h3>■スタック</h3>
<h4>スタックとは</h4>
<p>順列において、最初に挿入されたデータが最後に取り出される。最後に挿入したデータが最初に取り出されるデータ構造。LIFO（last in first out）と呼ばれる。</p>
<h4>実際のコード</h4>
<p>以下のようにarray_push関数を使用すると、第一引数の配列の最後尾に第二引数以降の値を、配列の要素として追加する。また、array_pop関数を使用すると、配列の最終要素を削除し戻り値として返します。</p>
<pre class="brush: php;">
&lt;?php
$stack = array();
array_push($stack, 'John', 'Jack');
var_dump($stack);
/*
array(2) {
  [0]=&gt;
  string(4) &quot;John&quot;
  [1]=&gt;
  string(4) &quot;Jack&quot;
}
*/
$value = array_pop($stack);
var_dump($value);
var_dump($stack);
/*
string(4) &quot;Jack&quot;
array(1) {
  [0]=&gt;
  string(4) &quot;John&quot;
}
*/
?&gt;
</pre>
<p>但し、array_pushについては以下のようなコードでも同じようなことができる。そして、関数をコールするオーバーヘッドが発生しない分だけわずかに高速である。</p>
<pre class="brush: php;">
&lt;?php
$stack = array();
$stack[] = 'John';
$stack[] = 'Jack';
?&gt;
</pre>
<div class="kakomi">
<h5>各関数について</h5>
<dl>
<dt>int <strong>array_push</strong>(array &#038;$ary, mixed $var[, mixed $var, ...])</dt>
<dd>$aryの最後に、第二引数以降の値を配列の要素として追加する。</dd>
<dt>mixed <strong>array_pop</strong>(array &#038;$ary)</dt>
<dd>配列の最後から要素を取り除き、その値を返す。</dd>
</dl>
<p>ちなみにJavaScriptで以下のように書いてしまうと、シンタックスエラーとなる。</p>
<pre class="brush: php;">
var tmpAry[] = 'test';
//syntax error!!
</pre>
</div>
<h3>■キュー（待ち行列）</h3>
<h4>待ち行列とは</h4>
<p>データが順列に挿入された順序で、削除（処理）されていくようなデータ構造。FIFO（first in first out）と呼ばれる。</p>
<h4>実際のコード</h4>
<p>以下のように、array_shift関数を使うと第一引数で指定した配列の最初の要素を削除できる。また、array_unshift関数を使うと第一引数で指定した配列に、第二引数以降の要素を代入することができる。</p>
<pre class="brush: php;">
&lt;?php
$queue = array('John', 'Ken', 'Mike');
$value = array_shift($queue);
var_dump($value);//John
var_dump($queue);
/*
array(2) {
  [0]=&gt;
  string(3) &quot;Ken&quot;
  [1]=&gt;
  string(4) &quot;Mike&quot;
}
*/
array_unshift($queue, 'Nick', 'Emily');
var_dump($queue);
/*
array(4) {
  [0]=&gt;
  string(4) &quot;Nick&quot;
  [1]=&gt;
  string(5) &quot;Emily&quot;
  [2]=&gt;
  string(3) &quot;Ken&quot;
  [3]=&gt;
  string(4) &quot;Mike&quot;
}
*/
?&gt;
</pre>
<p>shiftとunshiftを使うとスタックと変わらない。従ってキューの実装にはarray_shift()とarray_push()を用いる。</p>
<div class="kakomi">
<h5>各関数について</h5>
<dl>
<dt>mixed <strong>array_shift</strong>(array &#038;$ary)</dt>
<dd>配列の先頭から要素を一つ取り出し、その値を返す。</dd>
<dt>int <strong>array_unshift</strong>(array &#038;$ary, mixed $var[, mixed $var])</dt>
<dd>第一引数の配列に、第二引数以降の値を配列の要素として加える。</dd>
</dl>
</div>
<h3>■集合と配列の比較</h3>
<p>集合とは、いくつかの要素の集まったデータ構造。配列を使用すると、集合論の基本となる和集合や積集合、対象差といった演算を実装できる。</p>
<h4>和集合</h4>
<p>集合Aと集合Bを結合し、重複を取り除いた集合。</p>
<pre class="brush: php;">
&lt;?php
$a = array(1, 5, 3, 9);
$b = array(2, 5, 9, 7);
$tmpAry = array_merge($a, $b);
$set = array_unique($tmpAry);
var_dump($set);
/*
array(6) {
  [0]=&gt;
  int(1)
  [1]=&gt;
  int(5)
  [2]=&gt;
  int(3)
  [3]=&gt;
  int(9)
  [4]=&gt;
  int(2)
  [7]=&gt;
  int(7)
}
*/
?&gt;
</pre>
<h4>配列（集合）の差分</h4>
<p>array_diff関数を使うと配列の差を計算することができる。以下のような場合、第一引数の配列の要素で、第二引数以降の配列に含まれて居ない要素を配列として返す。</p>
<pre class="brush: php;">
&lt;?php
$a = array(1, 3, 9, 27);
$b = array(1, 9, 2, 7);
var_dump(array_diff($a, $b));
/*
array(2) {
  [1]=&gt;
  int(3)
  [3]=&gt;
  int(27)
}
*/
?&gt;
</pre>
<p>また、配列の比較においてキーまで含める場合は以下のように、array_diff_assoc関数を使用する。</p>
<pre class="brush: php;">
&lt;?php
$a = array(1, 3, 9, 27);
$b = array(1, 9, 2, 7);
var_dump(array_diff_assoc($a, $b));
/*
array(3) {
  [1]=&gt;
  int(3)
  [2]=&gt;
  int(9)
  [3]=&gt;
  int(27)
}
*/
?&gt;
</pre>
<h4>配列（集合）の共通項</h4>
<p>array_intersect関数は以下のように、配列の共通項のリストを返す。</p>
<pre class="brush: php;">
&lt;?php
$a = array(1, 3, 9, 27);
$b = array(1, 9, 2, 7);
var_dump(array_intersect($a, $b));
/*
array(2) {
  [0]=&gt;
  int(1)
  [2]=&gt;
  int(9)
}
*/
?&gt;
</pre>
<div class="kakomi">
<h4>各関数について</h4>
<dl>
<dt>array <strong>array_merge</strong>(array $ary[, array $ary2])</dt>
<dd>複数の配列をマージし結果を返す。但し、連想配列の文字列が重複している場合は値が上書きされる。</dd>
<dt>array <strong>array_unique</strong>(array $ary[, int $sort_flags=SORT_REGULAR])</dt>
<dd>配列から重複を取り除いた配列を返す。</dd>
<dt>array <strong>array_diff</strong>(array $ary1, array $ary2)</dt>
<dd>$ary1の要素のうち$ary2に含まれないものを配列として返す。</dd>
<dt>array <strong>array_intersect</strong>(array $ary1, array $ary2)</dt>
<dd>配列の共通項を配列として返す。</dd>
</dl>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.justoneplanet.info/2009/04/21/php-arrays-as-stacks-queues-and-set%ef%bc%88%e3%82%b9%e3%82%bf%e3%83%83%e3%82%af%e3%83%bb%e5%be%85%e3%81%a1%e8%a1%8c%e5%88%97%e3%83%bb%e5%92%8c%e9%9b%86%e5%90%88%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Sorting Arrays（配列のソート）</title>
		<link>http://blog.justoneplanet.info/2009/04/21/php-sorting-arrays%ef%bc%88%e9%85%8d%e5%88%97%e3%81%ae%e3%82%bd%e3%83%bc%e3%83%88%ef%bc%89/</link>
		<comments>http://blog.justoneplanet.info/2009/04/21/php-sorting-arrays%ef%bc%88%e9%85%8d%e5%88%97%e3%81%ae%e3%82%bd%e3%83%bc%e3%83%88%ef%bc%89/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 15:26:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[配列]]></category>

		<guid isPermaLink="false">http://blog.justoneplanet.info/?p=869</guid>
		<description><![CDATA[■配列の値によるソート（0から始まる数値インデックスに直す） 以下のように、sort関数を使うと値をアルファベット順にソートし、インデックスを振りなおす。また第二引数にはSORT_REGULAR、SORT_NUMERIC [...]]]></description>
			<content:encoded><![CDATA[<h3>■配列の値によるソート（0から始まる数値インデックスに直す）</h3>
<p>以下のように、sort関数を使うと値をアルファベット順にソートし、インデックスを振りなおす。また第二引数にはSORT_REGULAR、SORT_NUMERIC、SORT_STRINGなどを取り、型を変換する事もできる。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array(
    'person1' =&gt; 'Emily',
    'person2' =&gt; 'Dennis',
    'person3' =&gt; 'Andy'
);
sort($tmpAry);
var_dump($tmpAry);
/*
array(3) {
  [0]=&gt;
  string(4) &quot;Andy&quot;
  [1]=&gt;
  string(6) &quot;Dennis&quot;
  [2]=&gt;
  string(5) &quot;Emily&quot;
}
*/
?&gt;
</pre>
<h4>逆順にソートするには</h4>
<p>以下のようにrsort関数を使用すると、sort関数を使った時とは逆順に並ぶ。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array(
    'person1' =&gt; 'Andy',
    'person2' =&gt; 'Dennis',
    'person3' =&gt; 'Emily'
);
rsort($tmpAry);
var_dump($tmpAry);
/*
array(3) {
  [0]=&gt;
  string(5) &quot;Emily&quot;
  [1]=&gt;
  string(6) &quot;Dennis&quot;
  [2]=&gt;
  string(4) &quot;Andy&quot;
}
*/
?&gt;
</pre>
<h4>戻り値について</h4>
<p>以下の例のようにsort関数は配列自身を変換し、戻り値は処理の成否についてのbool値が格納されるだけである。基本的に配列ソート関数は全て配列自身を変換し、戻り値は処理の成否としてのbool値となる。</p>
<pre class="brush: php;">
&lt;?php
var_dump(sort($tmpAry));//true or false
?&gt;
</pre>
<h4>ユーザー指定関数での並び替え</h4>
<p>以下のようにusort関数を使用する。第二引数には文字列で関数名を指定する。（但し、以下の例はグローバル空間が汚れないように、create_function関数を使っての匿名関数を利用している。）</p>
<pre class="brush: php;">
&lt;?php
$ary = array(1, 5, 2);
usort(
    $ary,
    create_function(
        '$a,$b',
        'if($a &lt; $b){return 1;}if($a === $b){return 0;}if($a &gt; $b){return -1;}'
    )
);
var_dump($ary);
/*
array(3) {
  [0]=&gt;
  int(5)
  [1]=&gt;
  int(2)
  [2]=&gt;
  int(1)
}
*/
?&gt;
</pre>
<h3>■配列の値によるソート（キーとの関係は維持）</h3>
<p>以下のようにasort関数を使うとキーとの関係は維持されつつ、値によるソートが行われる。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array(
    'person1' =&gt; 'Emily',
    'person2' =&gt; 'Dennis',
    'person3' =&gt; 'Andy'
);
asort($tmpAry);
var_dump($tmpAry);
/*
array(3) {
  [&quot;person3&quot;]=&gt;
  string(4) &quot;Andy&quot;
  [&quot;person2&quot;]=&gt;
  string(6) &quot;Dennis&quot;
  [&quot;person1&quot;]=&gt;
  string(5) &quot;Emily&quot;
}
*/
?&gt;
</pre>
<p>逆順にしたい時にはarsort関数を使用し、ユーザー定義関数でソートしたいときにはuasort関数を使用する。但し、今考える限りではキーとの関係を維持したままソートする有用なシチュエーションは思い浮かばない。</p>
<h3>■配列のキーによるソート</h3>
<p>以下のようにksort関数を使うと、配列のキーによってソートされる。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array(
    'Naomi' =&gt; 'student',
    'Dennis' =&gt; 'driver',
    'Emily' =&gt; 'traveler'
);
ksort($tmpAry);
var_dump($tmpAry);
/*
array(3) {
  [&quot;Dennis&quot;]=&gt;
  string(6) &quot;driver&quot;
  [&quot;Emily&quot;]=&gt;
  string(8) &quot;traveler&quot;
  [&quot;Naomi&quot;]=&gt;
  string(7) &quot;student&quot;
}
*/
?&gt;
</pre>
<p>また、逆順にしたい時はkrsort関数を使い、ユーザー定義関数でソートしたい時はuksort関数を使う。</p>
<p>PHPは内部的に配列のキーとは別に順序を持っている。内部順序とキーの順序が違う場合、json_encode関数を使うと変換が異なるので注意しなくてはならない。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array(
    2 =&gt; 'Naomi',
    1 =&gt; 'Dennis',
    0 =&gt; 'Emily'
);
var_dump($tmpAry);
ksort($tmpAry);
var_dump($tmpAry);
/*
array(3) {
  [2]=&gt;
  string(5) &quot;Naomi&quot;
  [1]=&gt;
  string(6) &quot;Dennis&quot;
  [0]=&gt;
  string(5) &quot;Emily&quot;
}
string(38) &quot;{&quot;2&quot;:&quot;Naomi&quot;,&quot;1&quot;:&quot;Dennis&quot;,&quot;0&quot;:&quot;Emily&quot;}&quot;
array(3) {
  [0]=&gt;
  string(5) &quot;Emily&quot;
  [1]=&gt;
  string(6) &quot;Dennis&quot;
  [2]=&gt;
  string(5) &quot;Naomi&quot;
}
string(26) &quot;[&quot;Emily&quot;,&quot;Dennis&quot;,&quot;Naomi&quot;]&quot;
*/
?&gt;
</pre>
<h3>■まとめ</h3>
<p>一覧にまとめると以下のようになる。</p>
<table>
<tr>
<th>処理</th>
<th>昇順</th>
<th>降順</th>
<th>ユーザー定義</th>
</tr>
<tr>
<td>値によるソート、インデックスの再ラベリング</td>
<td>sort</td>
<td>rsort</td>
<td>usort</td>
</tr>
<tr>
<td>値によるソート</td>
<td>asort</td>
<td>arsort</td>
<td>uasort</td>
</tr>
<tr>
<td>キーによるソート</td>
<td>ksort</td>
<td>krsort</td>
<td>uksort</td>
</tr>
</table>
<p>個人的な考えだが「昇順と降順」は引数でコントロールできるようにしてもイイと思う。</p>
<h4>ユーザー定義関数について</h4>
<pre class="brush: php;">
&lt;?php
$ary = array(1, 5, 2);
usort(
    $ary,
    create_function(
        '$a,$b',
        'if($a &lt; $b){return 1;}if($a === $b){return 0;}if($a &gt; $b){return -1;}'
    )
);
var_dump($ary);
/*
array(3) {
  [0]=&gt;
  int(5)
  [1]=&gt;
  int(2)
  [2]=&gt;
  int(1)
}
*/
?&gt;
</pre>
<ul>
<li>引数を2つとる</li>
<li>「if($a < $b){return 1;}」は「$a<$b」の時、そのままの順序である事を意味する。</li>
<li>「if($a > $b){return -1;}」は「$a>$b」の時、前後を入れ替える事を意味する。</li>
<li>「if($a === $b){return 0;}」は「$a === $b」の時、特に何もしない事を意味する。</li>
</ul>
<p>つまり、比較関数は最初の引数が2番目の引数より小さいか、等しいか、大きい場合に、 それぞれゼロ未満、ゼロに等しい、ゼロより大きい整数を返す。</p>
<h3>■自然順ソート</h3>
<p>通常のソート関数を使うと、以下のように不自然な結果となる。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array('10km', '5km', '7km');
sort($tmpAry);
var_dump($tmpAry);
/*
array(3) {
  [0]=&gt;
  string(4) &quot;10km&quot;
  [1]=&gt;
  string(3) &quot;5km&quot;
  [2]=&gt;
  string(3) &quot;7km&quot;
}
*/
?&gt;
</pre>
<p>以下のようにnatsort関数を使用すると、数字+単位のように扱われ、自然な並び順となる。また、大文字と小文字を区別しないnatcasesort関数もある。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array('10km', '5km', '7km');
natsort($tmpAry);
var_dump($tmpAry);
/*
array(3) {
  [1]=&gt;
  string(3) &quot;5km&quot;
  [2]=&gt;
  string(3) &quot;7km&quot;
  [0]=&gt;
  string(4) &quot;10km&quot;
}
*/
?&gt;
</pre>
<div class="kakomi">
<h4>各関数について</h4>
<dl>
<dt>bool <strong>natsort</strong>(array &#038;$ary)</dt>
<dd>自然順で配列をソートする。</dd>
<dt>bool <strong>natcasesort</strong>(array &#038;$ary)</dt>
<dd>大文字と小文字を区別しない自然順アルゴリズムでソートする。</dd>
</dl>
</div>
<h3>■配列のシャッフル</h3>
<p>以下のようにshuffle関数を使うと、配列をランダムに並び替えることができる。以下の結果は実行ごとに異なるが、キーは必ず削除され数値のインデックスが割り当てられる。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array(
    'person1' =&gt; 'Emily',
    'person2' =&gt; 'Dennis',
    'person3' =&gt; 'Andy'
);
shuffle($tmpAry);
/*
array(3) {
  [0]=&gt;
  string(6) &quot;Dennis&quot;
  [1]=&gt;
  string(5) &quot;Emily&quot;
  [2]=&gt;
  string(4) &quot;Andy&quot;
}
*/
?&gt;
</pre>
<div class="kakomi">
<h4>各巻数について</h4>
<dl>
<dt>bool <strong>shuffle</strong>(array &#038;$ary)</dt>
<dt>配列をシャッフルする。但し、既存のキーは削除される。</dt>
</dl>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.justoneplanet.info/2009/04/21/php-sorting-arrays%ef%bc%88%e9%85%8d%e5%88%97%e3%81%ae%e3%82%bd%e3%83%bc%e3%83%88%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Array Iteration（配列の繰り返し）</title>
		<link>http://blog.justoneplanet.info/2009/04/19/php-array-iteration%ef%bc%88%e9%85%8d%e5%88%97%e3%81%ae%e7%b9%b0%e3%82%8a%e8%bf%94%e3%81%97%ef%bc%89/</link>
		<comments>http://blog.justoneplanet.info/2009/04/19/php-array-iteration%ef%bc%88%e9%85%8d%e5%88%97%e3%81%ae%e7%b9%b0%e3%82%8a%e8%bf%94%e3%81%97%ef%bc%89/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 03:46:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[配列]]></category>

		<guid isPermaLink="false">http://blog.justoneplanet.info/?p=857</guid>
		<description><![CDATA[■配列のポインタ 各々の配列は、現在の要素を示すポインタ（イテレータ）を持っている。 current() 現在のポインタが指している要素 key() 現在の要素のキーを返す reset() ポインタを先頭に移動 end( [...]]]></description>
			<content:encoded><![CDATA[<h3>■配列のポインタ</h3>
<p>各々の配列は、現在の要素を示すポインタ（イテレータ）を持っている。</p>
<dl>
<dt>current()</dt>
<dd>現在のポインタが指している要素</dd>
<dt>key()</dt>
<dd>現在の要素のキーを返す</dd>
<dt>reset()</dt>
<dd>ポインタを先頭に移動</dd>
<dt>end()</dt>
<dd>ポインタを配列の最後の要素に移動</dd>
<dt>next()</dt>
<dd>ポインタを1つ次に移動</dd>
<dt>prev()</dt>
<dd>ポインタを1つ前に移動</dd>
<dt>each()</dt>
<dd>現在のキーと値を配列として返し、ポインタを次に移動</dd>
</dl>
<p>以下のように使用する。通常、whileはポインタの移動を行わないので、ポインタを移動させる関数の使用や、ループの終了条件の設定が不可欠である。また、foreachを使わないメリットは、配列のコピーを生成しないのでメモリを節約できる点である。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array('a' =&gt; 1, 'b' =&gt; 2, 'c' =&gt; 3);
function display(&amp;$array){
    reset($array);
    while(key($array) !== null){
        echo key($array) . ': ' . current($array) . PHP_EOL;
        next($array);
    }
}
display($tmpAry);
?&gt;
</pre>
<p>以下のように配列の後方からループさせることもできる。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array('a' =&gt; 1, 'b' =&gt; 2, 'c' =&gt; 3);
end($tmpAry);
while(key($tmpAry) !== null){
    echo key($array) . ': ' . current($array) . PHP_EOL;
    prev($array);
}
?&gt;
</pre>
<p>また、以下のようにforeachと同じような表現をすることが可能だ。この方法は大きな配列でメモリーを節約したい場合などに有効である。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array('a' =&gt; 1, 'b' =&gt; 2, 'c' =&gt; 3);
reset($tmpAry);
while(list($key, $value) = each($tmpAry)){
    print(&quot;{$key}: {$value}&quot; . PHP_EOL);
}
?&gt;
</pre>
<h3>■foreach構文</h3>
<p>上述のように、whileを使ったループコントロールはメモリ消費を抑制できるかわりに、コードが煩雑になる。従って、個人的には以下のようなforeachでのコントロールをたいていは用いる。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array('a' =&gt; 1, 'b' =&gt; 2, 'c' =&gt; 3);
foreach($tmpAry as $key =&gt; $value){
    echo $key . ': ' . $value;
}
?&gt;
</pre>
<p>但し、foreach文では配列のコピーが生成されるので、ループ内で配列の要素（$tmpAry[$key]ではなく$value）に処理を加えても、元の配列には影響しない。もしも反映させたい場合は、以下のようにリファレンス（参照）を使う。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array('a' =&gt; 1, 'b' =&gt; 2, 'c' =&gt; 3);
foreach($tmpAry as $key =&gt; &amp;$value){
    echo $key . ': ' . $value;
    $value++;
}
var_dump($tmpAry);
/*
array(3) {
  [&quot;a&quot;]=&gt;
  ∫(2)
  [&quot;b&quot;]=&gt;
  ∫(3)
  [&quot;c&quot;]=&gt;
  ∫(4)
}
*/
?&gt;
</pre>
<p>しかし、この方法には後述のような危険性が潜んでいる。</p>
<h4>foreach構文におけるリファレンス使用の注意点</h4>
<p>以下のように空のループを2回繰り返すと、配列の中身が予想外に変更されてしまう。</p>
<pre class="brush: php;">
&lt;?php
$names = array('Nick', 'John', 'Mike');
foreach($names as $key =&gt; &amp;$value){
}
foreach($names as $key =&gt; $value){
}
var_dump($names);
/*
array(3) {
  [0]=&gt;
  string(4) &quot;Nick&quot;
  [1]=&gt;
  string(4) &quot;John&quot;
  [2]=&gt;
  &amp;string(4) &quot;John&quot;
}
*/
?&gt;
</pre>
<h5>原因</h5>
<ol>
<li>1回目のループ：&#038;$valueは配列の各要素の住所（リファレンス）となる。</li>
<li>1回目のループ：&#038;$valueは配列の最終要素のリファレンス（&#038;$names[2]）となる。</li>
<li>2回目のループ：各要素が既にassignされている$value（&#038;$names[2]）に代入されていく。</li>
</ol>
<p>つまり、$names[2] = $valueがループごとに起こる。</p>
<ol>
<li>2回目のループ（1）：$names[2]にNickが代入される。</li>
<li>2回目のループ（2）：$names[2]にJohnが代入される。</li>
<li>2回目のループ（3）：$names[2]に既に2回目のループ（2）で代入されているJohnにJohnが代入される。</li>
</ol>
<p>結果、Johnが重複する。それを防ぐ方法は以下のように、unsetを使って変数の割り当てを解除する事である。</p>
<pre class="brush: php;">
&lt;?php
$names = array('Nick', 'John', 'Mike');
foreach($names as $key =&gt; &amp;$value){
}
unset($value)
foreach($names as $key =&gt; $value){
}
var_dump($names);
?&gt;
</pre>
<p>個人的には度々この手法を使用するが、unsetを書き忘れた場合に極めてデバッグしづらい事も考えられる。従って、この手法を使わないという事も選択肢の1つだ。</p>
<h3>■for構文</h3>
<p>扱う配列のキーが数値のみであると分かっている場合、以下のようにする事ができる。for構文は配列のコピーを生成しない。</p>
<pre class="brush: php;">
&lt;?php
$names = array('Nick', 'John', 'Mike');
for($i = 0; $i &lt; count($names); $i++){
    //code
}
?&gt;
</pre>
<h3>■配列の要素に対する処理</h3>
<p>以下のように、array_walkやarray_walk_recursive（子配列まで再帰的に処理）を使って各要素に任意の処理を加えることができる。</p>
<pre class="brush: php;">
&lt;?php
$names = array(
    array('Nick', 38, 'driver'),
    array('John', 25, 'programmer'),
    array('Mike', 22, 'student')
);
function setUpper(&amp;$value, &amp;$key){
    $value = strtoupper($value);
}
array_walk_recursive($names, 'setUpper');
var_dump($names);
/*
array(3) {
  [0]=&gt;
  &amp;array(3) {
    [0]=&gt;
    string(4) &quot;NICK&quot;
    [1]=&gt;
    string(2) &quot;38&quot;
    [2]=&gt;
    string(6) &quot;DRIVER&quot;
  }
  [1]=&gt;
  &amp;array(3) {
    [0]=&gt;
    string(4) &quot;JOHN&quot;
    [1]=&gt;
    string(2) &quot;25&quot;
    [2]=&gt;
    string(10) &quot;PROGRAMMER&quot;
  }
  [2]=&gt;
  &amp;array(3) {
    [0]=&gt;
    string(4) &quot;MIKE&quot;
    [1]=&gt;
    string(2) &quot;22&quot;
    [2]=&gt;
    string(7) &quot;STUDENT&quot;
  }
}
*/
?&gt;
</pre>
<p>但し、個人的には関数名を文字列で渡す行為が嫌いなのもあり、イマイチこの方法は使わず単純に（再帰処理する関数を使って）ループさせることが多い。しかも、戻り値としては処理を加えた配列を返さない為、リファレンスを使う必要があり、コードも見づらい。このような点はJavaScriptの方が好きなところだ。</p>
<h4>array_combine関数（おまけ）</h4>
<p>以下のように、一方の配列をキー、もう一方の配列を値として、新しい配列を生成する。要素数が一致しない場合、エラーが起こる。</p>
<pre class="brush: php;">
&lt;?php
$a = array('php', 'js');
$b = array(
    array('print()', 'array()'),
    array('document.write()', 'new Array()')
);
$c = array_combine($a, $b);
var_dump($c);
/*
array(2) {
  [&quot;php&quot;]=&gt;
  array(2) {
    [0]=&gt;
    string(7) &quot;print()&quot;
    [1]=&gt;
    string(7) &quot;array()&quot;
  }
  [&quot;js&quot;]=&gt;
  array(2) {
    [0]=&gt;
    string(16) &quot;document.write()&quot;
    [1]=&gt;
    string(11) &quot;new Array()&quot;
  }
}
*/
?&gt;
</pre>
<p>個人的には、この関数の有用性が分からない。PHPは関数が豊富なのが魅力的の一つだが、無駄な関数もあるのではとか思ってしまうような1つである。</p>
<div class="kakomi">
<h5>各関数について</h5>
<dl>
<dt>bool <strong>array_walk</strong>(array &#038;$array, string $callbackname[, mixed $user_data])</dt>
<dd>配列の全ての要素にユーザ関数を適用する。ユーザ関数は第一引数に配列の値をとり、第二引数に配列のキーといった形式になる。</dd>
<dt>bool <strong>array_walk_recursive</strong>(array &#038;$array, string $callbackname[, mixed $user_data])</dt>
<dd>配列の全要素にユーザ関数を適用する（配列の）。ユーザ関数は第一引数に配列の値、第二引数に配列のキーといった形式になる。</dd>
<dt>array <strong>array_combine</strong>(array $keys, array $values)</dt>
<dd>一方の配列をキーとし他方を値として配列を生成する。</dd>
</dl>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.justoneplanet.info/2009/04/19/php-array-iteration%ef%bc%88%e9%85%8d%e5%88%97%e3%81%ae%e7%b9%b0%e3%82%8a%e8%bf%94%e3%81%97%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Array Operations（配列における演算子）</title>
		<link>http://blog.justoneplanet.info/2009/04/18/php-array-operations%ef%bc%88%e9%85%8d%e5%88%97%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b%e6%bc%94%e7%ae%97%e5%ad%90%ef%bc%89/</link>
		<comments>http://blog.justoneplanet.info/2009/04/18/php-array-operations%ef%bc%88%e9%85%8d%e5%88%97%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b%e6%bc%94%e7%ae%97%e5%ad%90%ef%bc%89/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 08:05:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[配列]]></category>

		<guid isPermaLink="false">http://blog.justoneplanet.info/?p=843</guid>
		<description><![CDATA[多くの演算子は、配列かどうかで異なった振る舞いをする。 &#60;?php $a = array(1, 2, 3); $b = array('a' =&#62; 1, 'b' =&#62; 2, 'c' =&#62; 3); v [...]]]></description>
			<content:encoded><![CDATA[<p>多くの演算子は、配列かどうかで異なった振る舞いをする。</p>
<pre class="brush: php;">
&lt;?php
$a = array(1, 2, 3);
$b = array('a' =&gt; 1, 'b' =&gt; 2, 'c' =&gt; 3);
var_dump($a + $b);
/*
array(6) {
  [0]=&gt;
  int(1)
  [1]=&gt;
  int(2)
  [2]=&gt;
  int(3)
  [&quot;a&quot;]=&gt;
  int(1)
  [&quot;b&quot;]=&gt;
  int(2)
  [&quot;c&quot;]=&gt;
  int(3)
}
*/
?&gt;
</pre>
<p>但し、配列のキーに重複が存在する場合は結果が異なる。</p>
<pre class="brush: php;">
&lt;?php
$a = array(1, 2, 3);
$b = array('a' =&gt; 1, 2, 3);
var_dump($a + $b);
/*
array(4) {
  [0]=&gt;
  int(1)
  [1]=&gt;
  int(2)
  [2]=&gt;
  int(3)
  [&quot;a&quot;]=&gt;
  int(1)
}
*/
?&gt;
</pre>
<h3>■配列の比較</h3>
<p>配列は以下のように、演算子（==、===）を使って比較することができる。</p>
<pre class="brush: php;">
&lt;?php
$a = array(1, 2, 3);
$b = array(0 =&gt; 1, 1 =&gt; 2, 2 =&gt; 3);
$c = array('a' =&gt; 1, 'b' =&gt; 2, 'c' =&gt; 3);
$d = array(2 =&gt; 3, 0 =&gt; 1, 1 =&gt; 2);
var_dump($a == $b);//true
var_dump($a === $b);//true
var_dump($a === $d);//false
var_dump($a == $c);//false
var_dump($a === $c);//false
?&gt;
</pre>
<p>基本的には、キーと値のペアが同じように存在していればtrueを返す。注目するべきなのは、$bと$dの違いである。キーと値のペアは同様に存在しているが、順序が異なっているとPHP内部では異なった配列として扱われている。その結果、2番目と3番目の表示が異なっている。</p>
<h3>■配列の要素</h3>
<h4>要素数</h4>
<p>以下の例が示すとおり（JavaScriptのlengthと同様）count関数は、スカラー値が引数に指定された時に常に1を返すため、配列かどうかの判定には使えない。</p>
<pre class="brush: php;">
&lt;?php
$tmAry = array(1, 4, 16);
print(count($tmpAry));//3
$tmpStr = 'sample';
print(count($tmpStr));//1
?&gt;
</pre>
<p>配列かどうかの判定をするには、以下のようにis_array関数を使う。</p>
<pre class="brush: php;">
&lt;?php
if(is_array($tmpAry)){
    //code
}
?&gt;
</pre>
<h4>任意の要素が存在するかテストする</h4>
<p>以下のようにin_array関数を使う。またデフォルトでは型のチェックは行われないが、3番目の引数にtrueをセットすることにより、型のチェックまで行うことができる。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array(1, 4, 16);
if(in_array(4, $tmpAry)){//true
    //code
}
?&gt;
</pre>
<h4>要素の削除</h4>
<p>要素を削除するには、以下のようにunset関数を使用する。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array(1, 4, 16);
unset($tmpAry[1]);
if(in_array(4, $tmpAry)){//false
    //code
}
?&gt;
</pre>
<h4>ランダムに要素を取得する</h4>
<p>array_rand関数を使用すると、第二引数で指定した数だけランダムに配列から要素を取り出す。第二引数のデフォルトは1である。また、第二引数が2以上の場合だけ、戻り値も配列となる。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array('a' =&gt; 'sample', 'b' =&gt; 'test', 'c' =&gt; 'prototype');
$value = array_rand($tmpAry);//string(1) &quot;b&quot;
$values = array_rand($tmpAry, 2);
/*
array(2) {
  [0]=&gt;
  string(1) &quot;a&quot;
  [1]=&gt;
  string(1) &quot;b&quot;
}
*/
?&gt;
</pre>
<div class="kakomi">
<h5>各関数について</h5>
<dl>
<dt>bool <strong>in_array</strong>(mixed $needle, array $haystack[, bool $strict=false])</dt>
<dd>$needleが配列$haystackに存在するかを返す。第三引数で「true」を指定すると型の整合性まで調べる。</dd>
<dt>mixed <strong>array_rand</strong>(array $input[, int $num_request=1])</dt>
<dd>ランダムに配列のキーを選び、その値を返す。第二引数に2以上の値を設定した場合は、配列のキーの配列が返る。</dd>
<dt>void <strong>unset</strong>(mixed $var[, ...])</dt>
<dd>指定した変数の割り当てを解除する。但し、実際には関数ではなく言語構造である。</dd>
</dl>
</div>
<h3>■配列のキーを取得</h3>
<p>以下のようにarray_keys関数を使用すると、配列のキーが配列として返される。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array('a' =&gt; 'sample', 'b' =&gt; 'test', 'c' =&gt; 'prototype');
$keys = array_keys($tmpAry);
var_dump($keys);
/*
array(3) {
  [0]=&gt;
  string(1) &quot;a&quot;
  [1]=&gt;
  string(1) &quot;b&quot;
  [2]=&gt;
  string(1) &quot;c&quot;
}
*/
?&gt;
</pre>
<div class="kakomi">
<h4>各関数について</h4>
<dl>
<dt>array <strong>array_keys</strong>(array $input)</dt>
<dd>配列のキーを全て返す。</dd>
</dl>
</div>
<h3>■配列の反転</h3>
<h4>キーと値の反転</h4>
<pre class="brush: php;">
&lt;?php
$tmpAry = array('a' =&gt; 'sample', 'b' =&gt; 'test', 'c' =&gt; 'prototype');
var_dump(array_flip($tmpAry));
/*
array(3) {
  [&quot;sample&quot;]=&gt;
  string(1) &quot;a&quot;
  [&quot;test&quot;]=&gt;
  string(1) &quot;b&quot;
  [&quot;prototype&quot;]=&gt;
  string(1) &quot;c&quot;
}
*/
?&gt;
</pre>
<h4>順序の反転</h4>
<p>以下のようにarray_reverse関数は順序を逆にした配列を返す。但し、キーが文字列のペアの関係性は保持され、キーが数値の要素のみ順序が逆になる。また以下の例を見ての通り、array()で指定した順序と逆の結果が出力される。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array(0 =&gt; 'sample', 1 =&gt; 'test', 'c' =&gt; 'prototype');
var_dump(array_reverse($tmpAry));
/*
array(3) {
  [&quot;c&quot;]=&gt;
  string(9) &quot;prototype&quot;
  [0]=&gt;
  string(4) &quot;test&quot;
  [1]=&gt;
  string(6) &quot;sample&quot;
}
*/
?&gt;
</pre>
<p>個人的には、この手の関数は殆ど使用した事はない。</p>
<div class="kakomi">
<h5>各関数について</h5>
<dl>
<dt>array <strong>array_flip</strong>(array $ary)</dt>
<dd>配列$aryのキーが値に、値がキーになった配列を返す。但し、キーに重複が出た場合は最後の値で上書きされる。また、値にオブジェクトなどがあった場合は、警告を発し処理が飛ばされる。</dd>
<dt>array <strong>array_reverse</strong>(array $ary[, bool $preserve_keys=false])</dt>
<dd>要素を逆順にした配列を返す。第二引数が「true」の場合は、キーが保持される。</dd>
</dl>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.justoneplanet.info/2009/04/18/php-array-operations%ef%bc%88%e9%85%8d%e5%88%97%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b%e6%bc%94%e7%ae%97%e5%ad%90%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Array Basics（配列の基本）</title>
		<link>http://blog.justoneplanet.info/2009/04/17/php-array-basics/</link>
		<comments>http://blog.justoneplanet.info/2009/04/17/php-array-basics/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 15:56:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[配列]]></category>

		<guid isPermaLink="false">http://blog.justoneplanet.info/?p=752</guid>
		<description><![CDATA[■配列の種類 インデックス配列 キーが数字の、いわゆる普通の配列。 &#60;?php $ary = array(10, 20, 30); ?&#62; 連想配列 キーが文字列。特に連想配列の場合は以下のように記述して縦の列 [...]]]></description>
			<content:encoded><![CDATA[<h3>■配列の種類</h3>
<h4>インデックス配列</h4>
<p>キーが数字の、いわゆる普通の配列。</p>
<pre class="brush: php;">
&lt;?php
$ary = array(10, 20, 30);
?&gt;
</pre>
<h4>連想配列</h4>
<p>キーが文字列。特に連想配列の場合は以下のように記述して縦の列を揃えると、コードが見やすくなる。</p>
<pre class="brush: php;">
&lt;?php
$ary = array(
    'a' =&gt; 'John',
    'b' =&gt; 'Nick',
    'c' =&gt; 'Michel'
);
?&gt;
</pre>
<h3>■配列の生成方法</h3>
<h4>関数を使う</h4>
<pre class="brush: php;">
&lt;?php
$ary = array(1, 3, 7);
?&gt;
</pre>
<h4>[]を使う</h4>
<p>存在しない配列にデータを代入しようとすると、その時点で配列が生成される。その原理を利用する方法。</p>
<pre class="brush: php;">
&lt;?php
$ary[0] = 1;
$ary[1] = 3;
$ary[2] = 7;
?&gt;
</pre>
<div class="kakomi">
<h5>各関数について</h5>
<dl>
<dt>array <strong>array</strong>([mixed $var, ...])</dt>
<dd>配列を生成する。但し、実際には関数ではなく言語構造である。</dd>
</dl>
</div>
<h3>■配列の表示</h3>
<p>デバッグなどを目的として配列の構造と要素を表示したい時、以下の2つの関数は各要素を再帰的に表示する。</p>
<h4>print_r()</h4>
<p>第2引数にtrueを設定する事により戻り値を発生させ、変数に値を格納させる事ができる。また配列のポインタは末端に移動する。</p>
<pre class="brush: php;">
&lt;?php
$ary = array(
    1 =&gt; 'sample',
    'a' =&gt; array(1,5,9),
    2 =&gt; 5
);
print_r($ary);
/*
Array
(
    [1] =&gt; sample
    [a] =&gt; Array
        (
            [0] =&gt; 1
            [1] =&gt; 5
            [2] =&gt; 9
        )

    [2] =&gt; 5
)
*/
?&gt;
</pre>
<h4>var_dump()</h4>
<p>引数に1つ以上の変数をとり、複数の変数を表示させる事ができる。より詳細なデータが見れるので、デバッグ目的ではコチラの関数を個人的には多用している。</p>
<pre class="brush: php;">
&lt;?php
$ary = array(
    1 =&gt; 'sample',
    'a' =&gt; array(1,5,9),
    2 =&gt; 5
);
var_dump($ary);
/*
array(3) {
  [1]=&gt;
  string(6) &quot;sample&quot;
  [&quot;a&quot;]=&gt;
  array(3) {
    [0]=&gt;
    int(1)
    [1]=&gt;
    int(5)
    [2]=&gt;
    int(9)
  }
  [2]=&gt;
  int(5)
}
*/
?&gt;
</pre>
<div class="kakomi">
<h5>各関数について</h5>
<dl>
<dt>mixed <strong>print_r</strong>(mixed $expression[, bool $return=false])</dt>
<dd>指定した変数の詳細を型に合わせて表示する。但し、第二引数に「true」を設定すると値を返す。</dd>
<dt>void <strong>var_dump</strong>(mixed $expression[, mixed $expression])</dt>
<dd>指定した変数の詳細を型に合わせて表示する。複数の変巣を一度に表示することができる。</dd>
</dl>
</div>
<h3>■配列末尾への値の追加</h3>
<p>以下のコードは、0から始まる数値のうち、最初に見つかった空きインデックスに要素を追加する方法。連想配列に対しても使用が可能であり、0から数値が割り当てられていくが、通常ではそのような使用はしない。</p>
<pre class="brush: php;">
&lt;?php
$person[0] = 'Mike';
$person[] = 'Nick';//1が割り当てられる
?&gt;
</pre>
<p>但し、0から始まる数値のうち任意の正の数字インデックスが使用されている場合は、以下のようにそのインデックスの次の数字から値が格納されていく。</p>
<pre class="brush: php;">
&lt;?php
$tmpAry = array();
$tmpAry[10] = '1';
$tmpAry[] = 'test';//11が割り当てられる
var_dump($tmpAry);
/*
array(2) {
  [10]=&gt;
  string(1) &quot;1&quot;
  [11]=&gt;
  string(4) &quot;test&quot;
}
*/
?&gt;
</pre>
<h3>■Multi-dimentional Arrays（多次元配列）</h3>
<pre class="brush: php;">
&lt;?php
$ary = array();
$ary[] = array(
    'Nick',
    'John'
);
$ary[] = array(
    'Emily',
    'Naomi'
);
print(&quot;Hello, {$ary[0][1]} and {$ary[1][1]}&quot;);
?&gt;
</pre>
<h4>活用例</h4>
<pre class="brush: php;">
$tmpAry = array();
foreach($ary as $key =&gt; $value){
    if(!is_array($tmpAry[$key])){
        $tmpAry[$key] = array();
    }
    $tmpAry[$key]['id'] = $value['id'];
    $tmpAry[$key]['value'] = $value['value'];
}
</pre>
<p>よりも以下のコードの方が美しいと思う。</p>
<pre class="brush: php;">
$tmpAry = array();
foreach($ary as $key =&gt; $value){
    $tmpAry[] = array(
        'id' =&gt; $value['id'],
        'value' =&gt; $value['value'],
    );
}
</pre>
<h3>■配列の展開</h3>
<p>listは実際には言語の構成要素であり戻り値を発生させない。また左辺のlistの引数が多い場合、余った変数にnullが代入される。右辺の配列の要素数が多い場合、特に問題は発生しない。</p>
<pre class="brush: php;">
&lt;?php
$peple = array('John', 'Mike', 'Nick');
list($person1, $person2, $person3) = $people;
?&gt;
</pre>
<p>以下のような場合に有用かもしれない。</p>
<pre class="brush: php;">
&lt;?php
$sql = &quot;SELECT `name`, `age`, `job` FROM `data`&quot;;
$result = mysql_query($sql);
while(list($name, $age, $job) = $mysql_fetch_row($result)){
    echo &quot;{$name}({$age}) - {$job}&quot;;
}
?&gt;
</pre>
<p>但し、個人的には以下のようにループを使って処理するタイプなのでlistを使うことは少ない。</p>
<pre class="brush: php;">
&lt;?php
$sql = &quot;SELECT `name`, `age`, `job` FROM `data`&quot;;
$result = mysql_query($sql);
while($row = mysql_fetch_array($result)){
    echo &quot;{$row['name']}({$row['age']}) - {$row['job']}&quot;;
}
?&gt;
</pre>
<div class="kakomi">
<h4>各関数について</h4>
<dl>
<dt>void <strong>list</strong>(mixed $var[, ...])</dt>
<dd>複数の変数に配列の値を格納する。実際には関数ではなく言語構造である。</dd>
</dl>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.justoneplanet.info/2009/04/17/php-array-basics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

