<?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>vonski {web.developer}</title>
	<atom:link href="http://tomek.rychtyk.pl/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://tomek.rychtyk.pl/blog</link>
	<description>czyli (nie)codzienne zmagania z programowaniem i kodowaniem</description>
	<lastBuildDate>Fri, 23 Mar 2012 10:12:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Równe czy nierówne? Czyli tablice porównań w PHP</title>
		<link>http://tomek.rychtyk.pl/blog/2012/02/29/rowne-nierowne-czyli-tablice-porownan-w-php/</link>
		<comments>http://tomek.rychtyk.pl/blog/2012/02/29/rowne-nierowne-czyli-tablice-porownan-w-php/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 23:06:18 +0000</pubDate>
		<dc:creator>vonski</dc:creator>
				<category><![CDATA[Notatki do ZCE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Podstawy]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[porównania]]></category>

		<guid isPermaLink="false">http://tomek.rychtyk.pl/blog/?p=445</guid>
		<description><![CDATA[PHP ma to do siebie, że bardzo luźno traktuje typy zmiennych. Do jednej zmiennej możemy przypisać np. tekst, by zaraz po tym zamienić ją na liczbę. Oczywiście sam proces rzutowania wykonywany jest w tle, nie musimy specjalnie zaznaczać faktu, że właśnie zmieniamy typ zmiennej &#8211; PHP robi to za nas. I właśnie takie samo zjawisko [...]]]></description>
			<content:encoded><![CDATA[<a href="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png"><img src="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png" alt="" title="1289946386_folder_black_PHP" width="128" height="105" class="alignleft size-full wp-image-307" /></a>
PHP ma to do siebie, że bardzo luźno traktuje typy zmiennych. Do jednej zmiennej możemy przypisać np. tekst, by zaraz po tym zamienić ją na liczbę. Oczywiście sam proces rzutowania wykonywany jest w tle, nie musimy specjalnie zaznaczać faktu, że właśnie zmieniamy typ zmiennej &#8211; PHP robi to za nas. I właśnie takie samo zjawisko zachodzi podczas wszelkiego rodzaju porównań dwóch zmiennych, co czasem prowadzi do otrzymywania niespodziewanych wyników.
<span id="more-445"></span>
<br /><br />
Poniższe tablice pokazują zachowanie typów i operatorów porównania, zarówno dla porównania zwykłego i ścisłego, a także zachowanie funkcji takich jak <strong>empty</strong>, <strong>isset</strong> oraz <strong>is_null</strong> w określonych sytuacjach.

<br /><br />
<strong>Tablica #1. Porównanie za pomocą funkcji / konstrukcji językowych PHP.</strong><br />
<table cellspacing="0" style="border:1px solid #000;margin-left:0;">
<tr>
<td style="background:#bababa;width:120px;text-align:center;font-weight:700;">wyrażenie</td>
<td style="background:#bababa;width:100px;text-align:center;font-weight:700;">empty()</td>
<td style="background:#bababa;width:100px;text-align:center;font-weight:700;">is_null()</td>
<td style="background:#bababa;width:100px;text-align:center;font-weight:700;">isset()</td>
<td style="background:#bababa;width:100px;text-align:center;font-weight:700;">if($x)</td>
</tr>

<tr>
<td style="background:#e1e1e1;">$x = &#8221;&#8221;;</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
</tr>
<tr>
<td style="background:#efefef;">$x = &#8221; &#8221;;</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
</tr>
<tr>
<td style="background:#e1e1e1;">$x;</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
</tr>
<tr>
<td style="background:#efefef;">$x niezdefiniowane</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
</tr>
<tr>
<td style="background:#e1e1e1;">$x = array();</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
</tr>
<tr>
<td style="background:#efefef;">$x = false;</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
</tr>
<tr>
<td style="background:#e1e1e1;">$x = true;</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
</tr>
<tr>
<td style="background:#efefef;">$x = 1;</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
</tr>
<tr>
<td style="background:#e1e1e1;">$x = 42;</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
</tr>
<tr>
<td style="background:#efefef;">$x = 0;</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
</tr>
<tr>
<td style="background:#e1e1e1;">$x = -1;</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
</tr>
<tr>
<td style="background:#efefef;">$x = &#8217;1&#8242;;</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
</tr>
<tr>
<td style="background:#e1e1e1;">$x = &#8217;0&#8242;;</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
</tr>
<tr>
<td style="background:#efefef;">$x = &#8216;-1&#8242;;</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
</tr>
<tr>
<td style="background:#e1e1e1;">$x = &#8216;php&#8217;;</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
</tr>
<tr>
<td style="background:#efefef;">$x = &#8216;true&#8217;;</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
</tr>
<tr>
<td style="background:#e1e1e1;">$x = &#8216;false&#8217;;</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;color:#0dbe00;">TRUE</td>
</tr>
<tr>
<td style="background:#efefef;">$x = &#8217;00&#8242;;</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#ca0000;text-align:center;">FALSE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
<td style="background:#efefef;color:#0dbe00;text-align:center;">TRUE</td>
</tr>
</table>

Na co w szczególności należy tutaj zwrócić uwagę? Po pierwsze &#8211; <strong>spacja to też znak</strong>! Dlatego tekst składający się z samej spacji traktowany jest jak pełnoprawny string. Mimo tego, że wizualnie wygląda jakby był pusty.<br />
Druga sprawa &#8211; tekst zawierający cyfrę zero rzutowany jest do inta i tym samym zawiera wartość logiczną <strong>FALSE</strong>. Ale tekst składający się z dwóch zer jest już zwykłym stringiem i zawiera wartość logiczną <strong>TRUE</strong>!
<br /><br />

<strong>Tablica #2. Porównanie za pomocą operatora ==</strong><br />
<table cellspacing="0" style="border:1px solid #000;margin-left:0;">
<tr>
<td style="background:#bababa;text-align:center;font-weight:700;"></td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">TRUE</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">FALSE</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">1</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">0</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">-1</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">&#8217;1&#8242;</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">&#8217;0&#8242;</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">&#8216;-1&#8242;</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">NULL</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">array()</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">&#8216;php&#8217;</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">&#8221;&#8221;</td>
</tr>

<tr>
<td style="background:#e1e1e1;font-weight:700;padding:5px 7px;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#efefef;font-weight:700;padding:5px 7px;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
</tr>

<tr>
<td style="background:#e1e1e1;font-weight:700;padding:5px 7px;">1</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#efefef;font-weight:700;padding:5px 7px;">0</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
</tr>

<tr>
<td style="background:#e1e1e1;font-weight:700;padding:5px 7px;">-1</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#efefef;font-weight:700;padding:5px 7px;">&#8217;1&#8242;</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#e1e1e1;font-weight:700;padding:5px 7px;">&#8217;0&#8242;</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#efefef;font-weight:700;padding:5px 7px;">&#8216;-1&#8242;</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#e1e1e1;font-weight:700;padding:5px 7px;">NULL</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
</tr>

<tr>
<td style="background:#efefef;font-weight:700;padding:5px 7px;">array()</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#e1e1e1;font-weight:700;padding:5px 7px;">&#8221;php&#8221;</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#efefef;font-weight:700;padding:5px 7px;">&#8221;&#8221;</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
</tr>
</table>

Myślę, że to co się przede wszystkim rzuca w oczy, to fakt że: <strong>&#8222;php&#8221; == 0</strong> daje w wyniku <strong>TRUE</strong>. Tak, tak, to nie jest pomyłka. Dzieje się tak dlatego, że podczas porównania tekstu z liczbą, tekst ten jest rzutowany na liczbę. A wynikiem rzutowania <strong>(int)&#8221;php&#8221;</strong> jest liczba zero. Jednak przy porównaniu <strong>&#8221;0&#8221; == &#8221;php&#8221;</strong> wynikiem jest <strong>FALSE</strong>. Jest to logiczne, ponieważ w tym przypadku porównujemy ze sobą dwa stringi &#8211; nie dochodzi tutaj do rzutowania.<br />
Warto też mieć na uwadze fakt, że porównania w PHP nie są przemienne. Albo inaczej mówiąc &#8211; nie działają jak równości w matematyce. Oto przykład:
<br /><br />

<strong>Przykład #1.</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #0000ff;">&quot;&quot;</span> <span style="color: #339933;">==</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// prawda</span>
<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// prawda</span>
<span style="color: #0000ff;">&quot;&quot;</span> <span style="color: #339933;">==</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// nieprawda! wynikiem tego porównania jest FALSE!</span></pre></div></div>




<br />

<strong>Tablica #3. Porównanie za pomocą operatora ===</strong>
<table cellspacing="0" style="border:1px solid #000;margin-left:0;">
<tr>
<td style="background:#bababa;text-align:center;font-weight:700;"></td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">TRUE</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">FALSE</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">1</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">0</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">-1</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">&#8217;1&#8242;</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">&#8217;0&#8242;</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">&#8216;-1&#8242;</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">NULL</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">array()</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">&#8216;php&#8217;</td>
<td style="background:#bababa;padding:5px 8px;text-align:center;font-weight:700;">&#8221;&#8221;</td>
</tr>

<tr>
<td style="background:#e1e1e1;font-weight:700;padding:5px 7px;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#efefef;font-weight:700;padding:5px 7px;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#e1e1e1;font-weight:700;padding:5px 7px;">1</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#efefef;font-weight:700;padding:5px 7px;">0</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#e1e1e1;font-weight:700;padding:5px 7px;">-1</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#efefef;font-weight:700;padding:5px 7px;">&#8217;1&#8242;</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#e1e1e1;font-weight:700;padding:5px 7px;">&#8217;0&#8242;</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#efefef;font-weight:700;padding:5px 7px;">&#8216;-1&#8242;</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#e1e1e1;font-weight:700;padding:5px 7px;">NULL</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#efefef;font-weight:700;padding:5px 7px;">array()</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#e1e1e1;font-weight:700;padding:5px 7px;">&#8221;php&#8221;</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
<td style="background:#e1e1e1;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
</tr>

<tr>
<td style="background:#efefef;font-weight:700;padding:5px 7px;">&#8221;&#8221;</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#ca0000;">FALSE</td>
<td style="background:#efefef;text-align:center;padding:5px 7px;color:#0dbe00;">TRUE</td>
</tr>
</table>

Myślę, że tutaj nie ma już większych niespodzianek. Operator ścisłego porównania oprócz wartości sprawdza także typ zmiennej &#8211; jeśli zmienne są innych typów nie dokonuje rzutowania tylko od razu zwraca <strong>FALSE</strong>.]]></content:encoded>
			<wfw:commentRss>http://tomek.rychtyk.pl/blog/2012/02/29/rowne-nierowne-czyli-tablice-porownan-w-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jak działają referencje?</title>
		<link>http://tomek.rychtyk.pl/blog/2012/02/23/jak-dzialaja-referencje/</link>
		<comments>http://tomek.rychtyk.pl/blog/2012/02/23/jak-dzialaja-referencje/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 20:12:20 +0000</pubDate>
		<dc:creator>vonski</dc:creator>
				<category><![CDATA[Notatki do ZCE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Podstawy]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[referencje]]></category>
		<category><![CDATA[unset]]></category>

		<guid isPermaLink="false">http://tomek.rychtyk.pl/blog/?p=442</guid>
		<description><![CDATA[Najprościej mówiąc, referencje w języku PHP pozwalają na dostęp do tej samej wartości za pośrednictwem różnych zmiennych. Z tym że należy liczyć się z tym, że referencje nie działają na tej samej zasadzie co wskaźniki w C. Przypisując zmienną $b do zmiennej $a przez referencję, nie sprawiamy, że $b pokazuje na $a (ani odwrotnie). Jeśli [...]]]></description>
			<content:encoded><![CDATA[<a href="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png"><img src="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png" alt="" title="1289946386_folder_black_PHP" width="128" height="105" class="alignleft size-full wp-image-307" /></a>Najprościej mówiąc, referencje w języku PHP pozwalają na dostęp do tej samej wartości za pośrednictwem różnych zmiennych. Z tym że należy liczyć się z tym, że referencje nie działają na tej samej zasadzie co wskaźniki w C. Przypisując zmienną $b do zmiennej $a przez referencję, nie sprawiamy, że $b pokazuje na $a (ani odwrotnie). Jeśli już coś gdzieś ma pokazywać, to można przyjąć, że od tego momentu obie zmienne wskazują na tą samą wartość.<br /><br />

<h2>Referencje &#8211; podstawy</h2>

Należy pamiętać, że mimo tego iż wiążąc dwie zmienne przez referencje sprawiamy, że obie odwołują się do tej samej wartości, to nadal to pozostają to dwie oddzielne zmienne. Więcej na ten temat napiszę podczas omawiania niszczenia referencji.
<br /><br />

<strong>Przykład #1. Tworzenie i użycie referencji.</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'cos innego'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Powyższy przykład da taki wynik:

<pre>
<code>
int 10
int 10
string 'cos innego' (length=10)
string 'cos innego' (length=10)
</code>
</pre>

Czyli wszystko zgodnie z planem. Wiążemy referencją <strong>$b</strong> z <strong>$a</strong> i od tego momentu obie zmienne wskazują na tą samą wartość. Czyli jeśli zmienimy tą wartość za pośrednictwem obojętnie której zmiennej, druga również to &#8222;odczuje&#8221; ponieważ odnosi się do tej samej wartości. A teraz trochę bardziej skomplikowany przykład.<br /><br />

<strong>Przykład #2. Nieco bardziej skomplikowany przypadek referencji</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">15</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$c</span><span style="color: #339933;">;</span></pre></div></div>




I zasadnicze pytanie &#8211; jaką wartość ma <strong>$a</strong>, jaką <strong>$b</strong>, a jaką <strong>$c</strong>?<br />
Aby na nie odpowiedzieć prześledźmy powyższy kod. Na początku mamy <strong>$a = 10</strong>. Następnie z tą <strong>wartością</strong> (czyli z <strong>10</strong>) wiążemy przez referencję zmienną <strong>$b</strong>. Teraz dochodzi nam jeszcze <strong>$c</strong>. I punkt kulminacyjny &#8211; wiążemy <strong>$c =&#038; $b</strong>. Pytanie które się nasuwa &#8211; jeśli wcześniej przypisaliśmy do <strong>$b</strong> przez referencję <strong>$a</strong>, a teraz wiążemy <strong>$b</strong> z wartością <strong>$c</strong>, to co się dzieje z <strong>$a</strong>? Czy <strong>$a</strong> też pokornie &#8222;powędruje&#8221; za <strong>$b</strong> i będzie wskazywać także na wartość <strong>$c</strong>. Otóż&#8230; NIE! <strong>$a</strong> nadal będzie miała wartość <strong>10</strong>. Dzieje się tak dlatego, że przez przypisanie przez referencje nie sprawiamy, że zmienne pokazują na siebie nawzajem tylko na wartość &#8211; czyli nie są wskaźnikami, co już było powiedziane na początku, ale mogło nie być takie oczywiste, dlatego chciałem pokazać to na przykładzie.

<h2>Przekazywanie przez referencje</h2>

Zmienną można przekazać do funkcji przez referencję, aby możliwe było wykonywanie operacji dokładnie na tej zmiennej, nie zaś na jej kopii. Jeśli jeszcze tego nie wiesz, to bardzo ważne jest, abyś zapamiętał, że:

<div class='stb-info_box' >
Podczas przekazywania zmiennej do funkcji przez wartość, PHP tworzy jej kopię lokalną, tylko na potrzeby danej funkcji. Gdy tylko działanie funkcji się zakończy, kopia ta jest niszczona, a oryginalna wartość nie ulega zmianie.
</div>

Przekazanie argumentu przez referencję pozwala nam zmienić to domyślne zachowanie i operować na oryginalnej wartości.<br /><br />
<strong>Przykład #3. Przekazywanie argumentu przez referencje i przez wartość.</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> doKwadratuPrzezReferencje<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$x</span> <span style="color: #339933;">*=</span> <span style="color: #000088;">$x</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> doKwadratuPrzezWartosc<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$x</span> <span style="color: #339933;">*=</span> <span style="color: #000088;">$x</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
doKwadratuPrzezReferencje<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
doKwadratuPrzezWartosc<span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\$</span>a = <span style="color: #006699; font-weight: bold;">$a</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\$</span>b = <span style="color: #006699; font-weight: bold;">$b</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>




Powyższy kod wyświetli:

<pre>
<code>
$a = 100
$b = 10
</code>
</pre>

Dla porównania mamy tutaj dwa przypadki &#8211; argument <strong>$a</strong> przekazywany jest do funkcji przez referencję (ampersand na liście argumentów funkcji <strong>doKwadratuPrzezReferencje)</strong>, a <strong>$b</strong> przez wartość. Jak widać po wykonaniu obu funkcji tylko jedna zmienna zmieniła wartość i jest nią oczywiście <strong>$a</strong>. <strong>$b</strong> pozostaje bez zmian, bo jak już było wspomniane przed sekundą, przy przekazaniu przez wartość, PHP tworzy kopię argumentu, sama oryginalna zmienna pozostaje bez zmian.<br /><br />
Jest tutaj jednakże jedna pułapka. Przekazanie argumentu przez referencję pozwala nam operować na oryginalnej wartości, ale nie odbywa się to bezpośrednio. Innymi słowy, przekazując <strong>$a</strong> do funkcji <strong>doKwadratuPrzezReferencje</strong> nie sprawiamy, że zmienna <strong>$x</strong> znajdująca się na liście argumentów staje się tym samym co <strong>$a</strong>. Powiedziałbym raczej, że <strong>$x</strong> staje się pełnomocnikiem <strong>$a</strong> w obrębie funkcji <strong>doKwadratuPrzezReferencje</strong>. Jednak nadal są to dwa osobne byty. Dobra, ale gdzie ta pułapka? Spójrzmy na poniższy kod:
<br /><br />

<strong>Przykład #4. Przekazanie argumentu do funkcji przez referencję raz jeszcze.</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">15</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> foo<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$x</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
foo<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




No i teraz pytanie &#8211; co z <strong>$a</strong>? Bo jak widać przekazujemy zmienną do funkcji przez referencję i oddajemy jej wartość &#8222;w ręce&#8221; <strong>$x</strong>. Tylko że <strong>$x</strong> zaraz po tym wiąże się referencją z wartością zmiennej <strong>$b</strong>. Z tego wynikałoby, że skoro <strong>$x</strong> reprezentuje <strong>$a</strong> to i <strong>$a</strong> staje się referencją do <strong>$b</strong>. No i tutaj trzeba sobie przypomnieć to, co mówiłem na początku &#8211; <strong>referencje nie są wskaźnikami!</strong> I tutaj widać to jak na dłoni, bo po wykonaniu tego kodu <strong>$a</strong> nie będzie referencją do <strong>$b</strong> &#8211; jej wartością pozostanie nadal <strong>10</strong>.  Także prawda jest taka, że w trakcie działania funkcji dostęp do wartości <strong>$a</strong> mamy tylko przy samym wywołaniu. Zaraz później zmienna <strong>$x</strong> wiąże się z <strong>$b</strong> i w tym momencie tracimy już możliwość operowania na <strong>$a</strong>. Jakiekolwiek operacje wykonywane na <strong>$x</strong> będą teraz odbijały się na faktycznym stanie zmiennej <strong>$b</strong> gdyż to do jej wartości <strong>$x</strong> jest od teraz referencją.

<h2>Zwracanie referencji</h2>
W PHP istnieje także możliwość zwrócenia referencji do jakiejś zmiennej jako wynik działania funkcji. 
<br /><br />

<strong>Przykład #5. Zwracanie referencji</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> foo
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setValue<span style="color: #009900;">&#40;</span><span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">a</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$val</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #339933;">&amp;</span>getValue<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">a</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$o1</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$a</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$o1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$o1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setValue</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'cos innego'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Kod ten wyświetli:

<pre>
<code>
10
100

object(foo)[1]
  private 'a' => &#038;string 'cos innego' (length=10)
</code>
</pre>

Jak widać w momencie przypisania <strong>$a =&#038; $o1->getValue();</strong> zmienna <strong>$a</strong> zostaje powiązana z wartością będącą składową obiektu <strong>$o1</strong>. Każde późniejsze operacje na tej wartości za pośrednictwem <strong>$o1</strong> odbijają się również na <strong>$a</strong>. Działa to też oczywiście w drugą stronę &#8211; po przypisaniu tekstu do <strong>$a</strong> składowa obiektu <strong>$o1</strong> także się zmieniła. Warto zauważyć, że nie ma znaczenia czy składowa jest public czy private.

<div class='stb-info_box' >
Warto zauważyć, że podczas zwracania referencji przez funkcję musimy dwukrotnie zaznaczyć, że zwrócona wartość będzie referencją &#8211; pierwszy raz podczas definiowania funkcji, drugi raz podczas przypisania.
</div>

<h2>Niszczenie referencji</h2>

Referencję między zmienną a wartością usuwa się za pomocą funckji <strong>unset</strong>.

<div class='stb-info_box' >
void <strong>unset</strong>(mixed $var [, mixed $...])
</div>

Funkcja ta bierze jako parametr nazwę zmiennej (lub kilku zmiennych), a następnie zrywa wiązanie między tą zmienną i jej wartością. Należy tu mieć na uwadze, że sama wartość niekoniecznie musi zostać zniszczona.
<br /><br />

<strong>Przykład #6. Niszczenie referencji.</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Po wykonaniu powyższego kodu, wartość <strong>5</strong> nadal będzie obecna w pamięci, ponieważ niszczymy jedynie powiązanie między zmienną <strong>$a</strong> i tą wartością. Nadal jednak istnieje drugie powiązanie &#8211; między <strong>$b</strong> i <strong>5</strong>.

<h2>Obiekty i referencje w PHP5</h2>
W piątej wersji PHP przepisano całkowicie model obiektowy języka. Z tego też względu zmianie uległ także sam mechanizm przekazywania oraz przypisywania obiektów do zmiennych. Potocznie przyjęło się, że obiekty przekazywane są w PHP5 przez referencję, co nie jest do końca prawdą. Jest to jednak o tyle szerokie zagadnienie, że poświęciłem mu <a href="http://tomek.rychtyk.pl/blog/2012/02/21/obiekty-i-referencje-w-php5/" title="Obiekty i referencje w PHP5">osobny wpis</a>]]></content:encoded>
			<wfw:commentRss>http://tomek.rychtyk.pl/blog/2012/02/23/jak-dzialaja-referencje/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obiekty i referencje w PHP5</title>
		<link>http://tomek.rychtyk.pl/blog/2012/02/21/obiekty-i-referencje-w-php5/</link>
		<comments>http://tomek.rychtyk.pl/blog/2012/02/21/obiekty-i-referencje-w-php5/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 22:59:49 +0000</pubDate>
		<dc:creator>vonski</dc:creator>
				<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[referencje]]></category>

		<guid isPermaLink="false">http://tomek.rychtyk.pl/blog/?p=435</guid>
		<description><![CDATA[Mówiąc o modelu obiektowym w PHP5 i o głównych jego różnicach względem PHP4, często można spotkać się ze stwierdzeniem, że &#8222;obiekty przekazywane są domyślnie przez referencję, nie przez wartość&#8221;. Żeby nie być gołosłownym, przytaczam przykład z książki &#8222;Linux, Apache, MySQL i PHP. Zaawansowane programowanie&#8221; autorstwa m.in. J. Gernera i E.Naramore wydanej w Polsce przez wydawnictwo [...]]]></description>
			<content:encoded><![CDATA[<a href="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png"><img src="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png" alt="" title="1289946386_folder_black_PHP" width="128" height="105" class="alignleft size-full wp-image-307" /></a>Mówiąc o modelu obiektowym w PHP5 i o głównych jego różnicach względem PHP4, często można spotkać się ze stwierdzeniem, że &#8222;obiekty przekazywane są domyślnie przez referencję, nie przez wartość&#8221;. Żeby nie być gołosłownym, przytaczam przykład z książki <strong>&#8222;Linux, Apache, MySQL i PHP. Zaawansowane programowanie&#8221;</strong> autorstwa m.in. J. Gernera i E.Naramore wydanej w Polsce przez wydawnictwo Helion:<br /><br />
<blockquote>
W języku PHP 5 zmienne [odwołujące się do obiektu - przyp. vonski] są domyślnie przekazywane przez referencję.
</blockquote>
<br />
Na wielu polskojęzycznych stronach traktujących o programowaniu obiektowym w PHP5 spotkałem się z podobną opinią. Prawda jest taka&#8230; że nie jest to do końca prawda <img src='http://tomek.rychtyk.pl/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> 

<span id="more-435"></span>
<br />
<h2>Ogólnie o referencjach</h2>
Żeby zrozumieć o co chodzi w tym całym zamieszaniu, musimy sobie przypomnieć, czym są w ogóle referencje. Bardzo dobrze wyjaśnia to sam manual PHP:

<div class='stb-info_box' >
Referencja jest aliasem pozwalającym dwóm różnym zmiennym odwoływać się do tej samej wartości.
</div>

Czyli generalnie sprawa jest prosta. Mając zmienną <strong>$a</strong>, której wartość wynosi <strong>10</strong> i przypisując ją przez referencję do zmiennej <strong>$b</strong> sprawiamy, że teraz <strong>$a</strong> i <strong>$b</strong> odwołują się do tej samej wartości (<strong>10</strong>). Czyli jeśli zmienimy tą wartość za pośrednictwem <strong>$b</strong>, również <strong>$a</strong> &#8222;odczuje&#8221; tego skutki, bo zmienna ta też odwołuje się do tej wartości (i vice versa).
<br /><br />
<strong>Przykład #1. Prosta referencja</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Zaraz po przypisaniu wartość zmiennej <span style="color: #000099; font-weight: bold;">\$</span>a to <span style="color: #006699; font-weight: bold;">$a</span>, a wartość zmiennej <span style="color: #000099; font-weight: bold;">\$</span>b to <span style="color: #006699; font-weight: bold;">$b</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">15</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Teraz <span style="color: #000099; font-weight: bold;">\$</span>a = <span style="color: #006699; font-weight: bold;">$a</span>, <span style="color: #000099; font-weight: bold;">\$</span>b = <span style="color: #006699; font-weight: bold;">$b</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">20</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;A teraz <span style="color: #000099; font-weight: bold;">\$</span>a = <span style="color: #006699; font-weight: bold;">$a</span>, <span style="color: #000099; font-weight: bold;">\$</span>b = <span style="color: #006699; font-weight: bold;">$b</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;I ostatecznie <span style="color: #000099; font-weight: bold;">\$</span>a = <span style="color: #006699; font-weight: bold;">$a</span>, <span style="color: #000099; font-weight: bold;">\$</span>b = <span style="color: #006699; font-weight: bold;">$b</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>



<br />
Wynikiem działania tego kodu będzie:
<pre>
<code>
Zaraz po przypisaniu wartość zmiennej $a to 10, a wartość zmiennej $b to 10
Teraz $a = 15, $b = 15
A teraz $a = 20, $b = 20 
I ostatecznie $a = , $b =
</code>
</pre>

Jak widać wszystko się zgadza &#8211; nie ważne czy wartość zmieniamy za pośrednictwem <strong>$a</strong> czy <strong>$b</strong>, zawsze obie zmienne będą przypisane do tej samej wartości.

<h2>Referencja i obiekt</h2>

Jak to wygląda w przypadku obiektów? Czy faktycznie przypisywane są one domyślnie przez referencję? Z pozoru mogłoby się tak wydawać i myślę, że dlatego tak dużo źródeł uznaje z góry, że obiekty przypisywane są zawsze przez referencję. Tak jednak nie jest. Załóżmy, że tworzymy nowy obiekt klasy <strong>Foo</strong>. Robimy to oczywiście za pomocą operatora new: <strong>$o1 = new Foo();</strong>. I teraz uwaga. Zmienna <strong>$o1</strong> nie przechowuje ani kopii obiektu, ani referencji do niego! Od tego momentu zmienna <strong>$o1</strong> zawiera <strong>identyfikator</strong> obiektu, za pośrednictwem którego daje nam możliwość operowania obiektem. Co za tym idzie? Skoro wartością zmiennej <strong>$o1</strong> jest identyfikator obiektu, przypisując tę wartość do zmiennej <strong>$o2</strong>, zmienna ta będzie zawierać <strong>kopię</strong> tego identyfikatora. Identyfikatora tego samego obiektu, do którego odwołuje się identyfikator przypisany do zmiennej <strong>$o1</strong>. Dlatego wykonując jakieś operacje na danym obiekcie za pośrednictwem zmiennej <strong>$o2</strong>, a potem odwołując się do tego obiektu za pośrednictwem zmiennej <strong>$o1</strong>, widzimy skutki naszych działań na obiekcie za pośrednictwem <strong>$o2</strong>. I stąd właśnie to złudne wrażenie, że w momencie przypisania <strong>$o2 = $o1</strong> przypisaliśmy obiekt przez referencję. Właściwie na tym etapie można byłoby przyjąć, że tak faktycznie jest, ale&#8230; Jak widzieliśmy w pierwszym przykładzie, po przypisaniu przez referencję <strong>$a = &#038;$b</strong> obie zmienne odwoływały się do tej samej wartości. Innymi słowy, <strong>$a</strong> stało się aliasem <strong>$b</strong> i odwrotnie. I w myśl tego jakąkolwiek wartość byśmy nie przypisali do <strong>$b</strong>, ta sama wartość &#8222;pojawiała się&#8221; w <strong>$a</strong>. Tak więc zakładając, że takie przypisanie obiektu <strong>$o2 = $o1</strong> jest wykonywane domyślnie przez referencję, można się spodziewać tego, że obie te zmienne odwołują się do tej samej wartości, a co za tym idzie, zmieniając tę wartość za pośrednictwem jednej zmiennej, to samo &#8222;odczuje&#8221; druga zmienna. Problem w tym, że tak nie jest, co dowodzi tego, że <strong>obiekty w PHP5 nie są domyślnie przypisywane przez referencję</strong>.
<br /><br />
<strong>Przykład #2. Dowód na to, że obiekty nie są przypisywane przez referencję</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Foo <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$o1</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$o1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">var</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$o2</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$o1</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$o2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">var</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">20</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$o2</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'coś innego'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Powyższy przykład wyświetli taki oto tekst:

<pre>
<code>
object(Foo)#2 (1) { ["var"]=> int(10) }
object(Foo)#2 (1) { ["var"]=> int(10) }

object(Foo)#2 (1) { ["var"]=> int(20) }
object(Foo)#2 (1) { ["var"]=> int(20) }

object(Foo)#2 (1) { ["var"]=> int(20) }
string(10) "coś innego" 
</code>
</pre>

Pierwsze przypisanie <strong>$o2 = $o1</strong> tworzy zmienną <strong>$o2</strong> której wartością jest kopia identyfikatora obiektu utworzonego za pomocą operacji <strong> new Foo()</strong>. Mamy więc w tym momencie dwa byty: oryginalny identyfikator, przypisany do <strong>$o1</strong> oraz jego kopię znajdującą się w posiadaniu <strong>$o2</strong>. Obydwa identyfikatory wskazują do tego samego obiektu, dlatego dopóki wykonujemy operacje <strong>na obiekcie</strong>, nie ma to znaczenia, czy posługujemy się zmienną <strong>$o1</strong>, czy <strong>$o2</strong> &#8211; zmianami zostanie dotknięty zawsze ten sam obiekt. I na tym etapie można odnieść wrażenie, że <strong>$o2</strong> jest aliasem <strong>$o1</strong>. Wątpliwości (a raczej ich rozwianie) pojawiają się, gdy chcemy zmodyfikować nie obiekt, a samą wartość przechowywaną przez którąś z tych zmiennych. W powyższym przykładzie do zmiennej <strong>$o2</strong> przypisujemy tekst &#8222;coś innego&#8221;, tym samym nadpisując kopię identyfikatora, którą przypisaliśmy zmiennej <strong>$o2</strong> przy pierwszym przypisaniu. Jednak zmienna <strong>$o1</strong> nadal przechowuje oryginalny identyfikator obiektu, ponieważ &#8222;nie wie&#8221; ona nic o tym, że <strong>$o2</strong> zmieniła wartość. I tu jest nasuwa się wniosek. Tak naprawdę, przypisanie <strong>$o2 = $o1</strong> jest zwykłym przypisaniem <strong>przez wartość</strong>. Trzeba się tylko zastanowić &#8211; co jest tą wartością? Otóż wartością jest owy identyfikator obiektu.<br />
Zmodyfikujemy powyższy przykład, aby pokazać co się stanie jeśli przypiszemy <strong>$o1</strong> do <strong>$o2</strong> przez referencję, czyli zamiast zwykłego przypisania zastosujemy taki zapis: <strong>$o2 = &#038;$o1</strong>.
<br /><br />

<strong>Przykład #3. Przypisanie (identyfikatora) obiektu przez referencję.</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$o1</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$o1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">var</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$o2</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$o1</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$o2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">var</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">20</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$o2</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'coś innego'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$o2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Po wykonaniu powyższego kodu, zobaczymy taki wynik:

<pre>
<code>
object(Foo)#2 (1) { ["var"]=> int(10) }
object(Foo)#2 (1) { ["var"]=> int(10) }
object(Foo)#2 (1) { ["var"]=> int(20) }
object(Foo)#2 (1) { ["var"]=> int(20) }
string(10) "coś innego"
string(10) "coś innego" 
</code>
</pre>

Jak widać, po zmianie wartości <strong>$o2</strong> na &#8222;coś innego&#8221;, wartość <strong>$o1</strong> również się zmieniła, ponieważ w tym przykładzie obie zmienne odnoszą się do tej samej wartości.<br />
Dla pełnego zrozumienia zamieszczam jeszcze taką graficzkę.<br /><br />

<strong>Przykład #4. Grafika pokazująca różnicę między przypisaniem identyfikatora obiektu przez wartość i przez referencję</strong>

<a href="http://tomek.rychtyk.pl/blog/wp-content/uploads/2012/02/ref2.gif"><img src="http://tomek.rychtyk.pl/blog/wp-content/uploads/2012/02/ref2.gif" alt="Referencje - przykład" title="Referencje - przykład" width="548" height="684" class="aligncenter size-full wp-image-440" /></a>
<div style="clear:both;"></div>
Mam nadzieję, że po dokładnej analizie powyższych przykładów, nikt już nie będzie miał wątpliwości, co do tego, w jaki sposób odbywa się przypisywanie obiektów do zmiennych. Trzeba po prostu zapamiętać, że każda zmienna przechowuje nie tyle obiekt, czy referencję do niego, co identyfikator obiektu, który jest niejako pośrednikiem między samą zmienną a obiektem (co obrazuje powyższa grafika).]]></content:encoded>
			<wfw:commentRss>http://tomek.rychtyk.pl/blog/2012/02/21/obiekty-i-referencje-w-php5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>array_walk i array_walk_recursive</title>
		<link>http://tomek.rychtyk.pl/blog/2012/01/27/array_walk-i-array_walk_recursive/</link>
		<comments>http://tomek.rychtyk.pl/blog/2012/01/27/array_walk-i-array_walk_recursive/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 16:51:04 +0000</pubDate>
		<dc:creator>vonski</dc:creator>
				<category><![CDATA[Notatki do ZCE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tablice]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tablice]]></category>
		<category><![CDATA[zce]]></category>

		<guid isPermaLink="false">http://tomek.rychtyk.pl/blog/?p=405</guid>
		<description><![CDATA[Obie funkcje służą do iterowania po tablicy, przy czym podczas każdej iteracji wywoływana jest funkcja zdefiniowana przez użytkownika (tzw. funkcja wywołania zwrotnego &#8211; z angielskiego callback function) dla każdego elementu. array_walk_recursive różni się od array_walk tym, że, jak sama nazwa wskazuje, funkcja wywołania zwrotnego wykonywana jest rekursywnie dla każdego elementu. array_walk Przykład działania: $array = [...]]]></description>
			<content:encoded><![CDATA[<a href="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png"><img src="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png" alt="" title="1289946386_folder_black_PHP" width="128" height="105" class="alignleft size-full wp-image-307" /></a>
Obie funkcje służą do iterowania po tablicy, przy czym podczas każdej iteracji wywoływana jest funkcja zdefiniowana przez użytkownika (tzw. funkcja wywołania zwrotnego &#8211; z angielskiego <em>callback function</em>) dla każdego elementu. <strong>array_walk_recursive</strong> różni się od <strong>array_walk</strong> tym, że, jak sama nazwa wskazuje, funkcja wywołania zwrotnego wykonywana jest rekursywnie dla każdego elementu.

<span id="more-405"></span>
<h2>array_walk</h2>
<div class='stb-info_box' >bool <strong>array_walk</strong> (array &#038;$array, callback $funcname [, mixed $userdata])<br />
Wykonuje zdefiniowaną przez użytkownika funkcję dla każdego elementu tablicy $array. <strong>array_walk</strong> przejdzie przez każdy element tablicy niezależnie od położenia wewnętrznego wskaźnika tablicowego.
<strong>Argumenty</strong><br />
<strong>$array</strong> &#8211; tablica wejściowa<br />
<strong>$funcname </strong>- funkcja zdefiniowana przez użytkownika wykonywana na każdym elemencie tablicy. Przeważnie <strong>$funcname</strong> przyjmuje dwa parametry: wartość bieżącego elementu tablicy $array oraz jego klucz<br />
<strong>$userdata </strong>- opcjonalny parametr; jeśli został on zdefiniowany podczas deklaracji funkcji, zostanie on przekazany jako trzeci parametr<br />
<strong>Zwracane wartości</strong><br />
Zwraca <strong>TRUE</strong> podczas powodzenia, lub <strong>FALSE</strong> przy niepowodzeniu.
Jeśli <strong>funcname</strong> wymaga więcej parametrów niż jej przekazano, zostanie wygenerowany błąd poziomu <strong>E_WARNING</strong>.
</div>

Przykład działania:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'d'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'lemon'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'a'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'orange'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'b'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'banana'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'c'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'apple'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> test_alter<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$item1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$prefix</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$item1</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$prefix}</span>_<span style="color: #006699; font-weight: bold;">{$item1}</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> test_print<span style="color: #009900;">&#40;</span><span style="color: #000088;">$item2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$key</span> . <span style="color: #006699; font-weight: bold;">$item2</span>&lt;br/&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Przed:&lt;br/&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">array_walk</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'test_print'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">array_walk</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'test_alter'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'fruit'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Po:&lt;br/&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">array_walk</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'test_print'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Powyższy kod wyświetli

<pre>
Przed:
d . lemon
a . orange
b . banana
c . apple
Po:
d . fruit_lemon
a . fruit_orange
b . fruit_banana
c . fruit_apple
</pre>

<h2>array_walk_recursive</h2>

<strong>array_walk_recursive</strong> działa podobnie z tą różnicą, że &#8222;wchodzi&#8221; ona w głębsze wymiary tablicy, jeśli takowe istnieją. Oto nieco zmodyfikowana wersja powyższego kodu:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'d'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'lemon'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'a'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'orange'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'b'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'banana'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'c'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'apple'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'z'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'foo'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> test_alter<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$item1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$prefix</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$item1</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$prefix}</span>_<span style="color: #006699; font-weight: bold;">{$item1}</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> test_print<span style="color: #009900;">&#40;</span><span style="color: #000088;">$item2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$key</span> . <span style="color: #006699; font-weight: bold;">$item2</span>&lt;br/&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Przed:&lt;br/&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">array_walk_recursive</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'test_print'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">array_walk_recursive</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'test_alter'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'pre'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Po:&lt;br/&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">array_walk_recursive</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'test_print'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Powyższe wyświetli nam:

<pre>
Przed:
d . lemon
a . orange
b . banana
c . apple
0 . 1
foo . 2
1 . 3
Po:
d . pre_lemon
a . pre_orange
b . pre_banana
c . pre_apple
0 . pre_1
foo . pre_2
1 . pre_3
</pre>

Warto zauważyć, że klucz &#8216;z&#8217; nie jest w ogóle wyświetlony &#8211; jest tak dlatego, że każdy klucz który przechowuje tablicę, nie będzie przekazany do funkcji.]]></content:encoded>
			<wfw:commentRss>http://tomek.rychtyk.pl/blog/2012/01/27/array_walk-i-array_walk_recursive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tablice jako stosty, kolejki lub zbiory #2</title>
		<link>http://tomek.rychtyk.pl/blog/2012/01/22/tablice-jako-stosty-kolejki-lub-zbiory-2/</link>
		<comments>http://tomek.rychtyk.pl/blog/2012/01/22/tablice-jako-stosty-kolejki-lub-zbiory-2/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 17:26:38 +0000</pubDate>
		<dc:creator>vonski</dc:creator>
				<category><![CDATA[Notatki do ZCE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tablice]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tablice]]></category>
		<category><![CDATA[zce]]></category>

		<guid isPermaLink="false">http://tomek.rychtyk.pl/blog/?p=423</guid>
		<description><![CDATA[We wcześniejszym wpisie skupiłem się na zastosowaniu tablic do odwzorowania stosów i kolejek. Do tego opisałem już wstępnie za pomocą jakich funkcji możemy ułatwić sobie życie traktując tablice jako zbiory. Przede wszystkim jest to funkcja array_diff oraz wszystkie jej pochodne. W tym wpisie chciałbym skupić się na kolejnej funkcji, mianowicie na array_intersect wyznaczającą nam część [...]]]></description>
			<content:encoded><![CDATA[<a href="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png"><img src="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png" alt="" title="1289946386_folder_black_PHP" width="128" height="105" class="alignleft size-full wp-image-307" /></a>

We <a href="http://tomek.rychtyk.pl/blog/2012/01/21/tablice-jako-stosy-i-kolejki/" title="Tablice jako stosy, kolejki lub zbiory #1">wcześniejszym wpisie</a> skupiłem się na zastosowaniu tablic do odwzorowania stosów i kolejek. Do tego opisałem już wstępnie za pomocą jakich funkcji możemy ułatwić sobie życie traktując tablice jako zbiory. Przede wszystkim jest to funkcja <strong>array_diff</strong> oraz wszystkie jej pochodne. W tym wpisie chciałbym skupić się na kolejnej funkcji, mianowicie na <strong>array_intersect</strong> wyznaczającą nam część wspólną dwóch, lub więcej zbiorów.

<span id="more-423"></span>
<br /><br />
<h3>array_intersect</h3>

<div class='stb-info_box' >
array <strong>array_intersect</strong>(array $array1, array $array2 [, array $ ...])
</div>

Funkcja ta, jak już wspomniałem we wstępie oblicza część wspólną z podanych jej argumentów. Widzimy, że tutaj, podobnie jak w przypadku <strong>array_diff</strong> można podać więcej niż jedną tablicę.<br />
Rozważmy taki kod:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Pitt'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pazura'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Nicholson'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pacino'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Willis'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'De Niro'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pacino'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Stuhr'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Garcia'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_intersect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Wyświetli on:

<pre>
<code>
Array
(
    [1] => Cruise
    [4] => Pacino
)
</code>
</pre>

Nie ma tu większej filozofii &#8211; zarówno &#8216;Cruise&#8217; jak i &#8216;Paciono&#8217; występują w obydwu tablicach, więc jest to cześć wspólna obu zbiorów.

<div class='stb-warning_box' >
Należy tutaj pamiętać, że <strong>array_intersect</strong> jak i każda jej pochodna, przy porównywaniu bierze pod uwagę wielkość liter.<br />
Inaczej rzecz ujmując, dwa elementy są traktowane jako równe jeśli:<br />
(string)$elem1 === (string)$elem2
</div>

<h3>array_intersect_assoc</h3>
<div class='stb-info_box' >
array <strong>array_intersect_assoc</strong>(array $array1, array $array2 [, array $ ...])
</div>

Funkcja <strong>array_intersect_assoc</strong> działa na podobnej zasadzie co poprzedniczka, tzn. wynikiem jej działania jest część wspólna z podanych tablic, jednak tutaj przy porównaniu brana jest pod uwagę również zgodność kluczy.<br />
Poniższy kod jest praktycznie taki sam jak w poprzednim przykładzie, różnie się jedynie tym, że zamiast <strong>array_intersect</strong> została użyta funkcja <strong>array_intersect_assoc</strong>:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Pitt'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pazura'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Nicholson'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pacino'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Willis'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'De Niro'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pacino'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Stuhr'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Garcia'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_intersect_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




A oto wynik jego działania:

<pre>
<code>
Array
(
    [1] => Cruise
)
</code>
</pre>

Jak nietrudno się domyślić, wynik różni się od poprzedniego z tego powodu, że o ile wcześniej wartości &#8216;Pacino&#8217; zgadzały się zarówno w jednej, jak i w drugiej tablicy, o tyle ich klucze nie są zgodne.

<h3>array_intersect_key</h3>

<div class='stb-info_box' >
array <strong>array_intersect_key</strong>(array $array1, array $array2 [, array $ ... ])
</div>

Trzecia wariacja funkcji <strong>array_intersect</strong> to <strong>array_intersect_key</strong>. Działa ona tak samo jak jej &#8222;oryginalna&#8221; wersja z tą różnicą, że nieważna jest zgodność wartości tablicy, tylko kluczy.<br />
Ponownie ten sam kod, ze zmienioną nazwą funkcji:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Pitt'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pazura'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Nicholson'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pacino'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Willis'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'De Niro'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pacino'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Stuhr'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Garcia'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_intersect_key</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




W wyniku zobaczymy:

<pre>
<code>
Array
(
    [0] => Pitt
    [1] => Cruise
    [2] => Pazura
    [3] => Nicholson
    [4] => Pacino
)
</code>
</pre>

Jest to tak naprawdę pierwsze pięć elementów tablicy <code>$array1</code>. Dlaczego? Jak już powiedziałem, <strong>array_intersect_key</strong> przy porównaniu bierze pod uwagę zgodność kluczy zarówno pierwszej jak i drugiej tablicy i na tej podstawie zwraca część wspólną. Zarówno w pierwszej, jak i drugiej tablicy występują klucze: 0, 1, 2, 3 i 4. Klucz 5 występuje tylko w pierwszej tablicy więc element do niego przypisany nie jest częścią wspólną. Trzeba też zwrócić uwagę, że wynikiem jest tablica zawierająca elementy tylko z pierwszej tablicy &#8211; druga jest jedynie do porównania.<br />
Zauważmy także, że nie na wynik nie ma wpływu kolejność kluczy w drugiej tablicy. Kod:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Pitt'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pazura'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Nicholson'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pacino'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Willis'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'De Niro'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Pacino'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Stuhr'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Garcia'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_intersect_key</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




da taki sam wynik co poprzedni.<br /><br />

A co będzie jak dodamy do porównania kolejną tablicę, w której jeden z elementów będzie miał klucz 5? Czy wówczas w wynikowej tablicy pojawią się wszystkie elementy? No bo przecież w sumie w porównaniu będą brały udział wszystkie klucze: od 0 do 4 w tablicy $array2 i klucz 5 w tablicy $array3. Otóż, wynikiem będzie&#8230; pusta tablica <img src='http://tomek.rychtyk.pl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  A to dlatego, że <strong>array_intersect_key zwraca tablicę będącą częścią wspólną WSZYSTKICH podanych do niej argumentów</strong>. Innymi słowy, porównywane klucze muszą znajdować się zarówno w pierwszej, drugiej i trzeciej tablicy. Czyli kod taki jak poniższy:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Pitt'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pazura'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Nicholson'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pacino'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Willis'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'De Niro'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Pacino'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Stuhr'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Garcia'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array3</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Depp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_intersect_key</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




wyświetli taki rezultat:

<pre>
<code>
Array
(
)
</code>
</pre>

<h3>array_uintersect</h3>

Wcześniej wspomniałem, że funkcja <strong>array_intersect</strong> bierze przy porównaniu pod uwagę wielkość liter. A co jeśli chcielibyśmy żeby było inaczej, czyli żeby funkcja nie zwracała uwagi na to czy dana wartość jest pisana dużą, czy małą literą. Tutaj z pomocą przychodzi nam <strong>array_uintersect</strong>. Pozwala ona bowiem sprecyzować nam sposób w jaki będą porównywane wartości tablicy &#8211; mówiąc prościej, możemy sami napisać / podać funkcję porównującą.

<div class='stb-info_box' >
array <strong>array_uintersect</strong>(array $array1, array $array2 [, array $ ...], callback $data_compare_func)
</div>

Poniżej przedstawiam użycie <strong>array_uintersect</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Pitt'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pazura'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Nicholson'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pacino'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Willis'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'De Niro'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'PACINO'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Stuhr'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Garcia'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$result1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_intersect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$result2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_uintersect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array2</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'strcasecmp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'array_intersect()'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'array_uintersect()'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




<pre>
<code>
array_intersect()
Array
(
    [1] => Cruise
)


array_uintersect()
Array
(
    [1] => Cruise
    [4] => Pacino
)
</code>
</pre>

Jak widać w pierwszym przypadku, przy użyciu zwykłej <strong>array_intersect</strong> dostaliśmy w wyniku tylko jeden element, drugi, &#8216;Pacino&#8217; został odrzucony, gdyż <code> (string)'Pacino' !== (string)'PACINO'</code>. W drugim przypadku do porównania została użyta funkcja <strong>strcasecmp</strong>, która nie rozróżnia wielkości liter, dlatego też w wyniku dostajemy zarówno &#8216;Cruise&#8217; jak i &#8216;Pacino&#8217;.

<h3>array_uintersect_assoc</h3>

<div class='stb-info_box' >
array <strong>array_uintersect_assoc</strong>(array $array1, array $array2 [, array $ ... ], callback $data_cmp_func)
</div>

Funkcja ta jest niemalże identyczna co poprzedniczka, z tą różnicą, że do porównania wchodzą również klucze. Tylko uwaga! O ile wartości są porównywane za pomocą funkcji dostarczonej przez użytkownika, o tyle klucze porównywane są za pomocą tej samej funkcji co w przypadku <strong>array_intersect_assoc</strong>.<br />
Rozważmy taki kod:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Almodovar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'b'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Bridges'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'c'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Cooper'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'d'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Depp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'ALMODOVAR'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'b'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Bacon'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'C'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Cooper'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'D'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Daniels'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_uintersect_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array2</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'strcasecmp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Da on w wyniku:

<pre>
<code>
Array
(
    [a] => Almodovar
)
</code>
</pre>

Dlaczego? Dlatego, że pomimo tego, że element &#8216;Cooper&#8217; przypisany jest raz do klucza &#8216;c&#8217;, a raz &#8216;C&#8217; &#8211; jak widać funkcja <strong>strcasecmp</strong> nie &#8222;obejmuje&#8221; sprawdzania kluczy &#8211; dlatego funkcja <strong>array_uintersect_assoc</strong> uznała, że ten element nie stanowi części wspólnej.

<h3>array_unitersect_uassoc</h3>
Trzymając się przykładu z rozróżnianiem wielkości liter przy porównaniu, z pomocą przychodzi nam funkcja <strong>array_uintersect_uassoc</strong>. Pozwala ona bowiem użytkownikowi na zdefiniowanie funkcji porównującej zarówno dla wartości, jak i dla kluczy.

<div class='stb-info_box' >
array <strong>array_uintersect_uassoc</strong>(array $array1, array $array2 [,$ ...], callback $data_cmp_func, callback $key_cmp_func)
</div>

Poniższy, zmodyfikowany kod, z użyciem <strong>array_uintersect_uassoc</strong>:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Almodovar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'b'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Bridges'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'c'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Cooper'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'d'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Depp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'ALMODOVAR'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'b'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Bacon'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'C'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Cooper'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'D'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Daniels'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_uintersect_uassoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array2</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'strcasecmp'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'strcasecmp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




da w wyniku:

<pre>
<code>
Array
(
    [a] => Almodovar
    [c] => Cooper
)
</code>
</pre>

Czyli jak widać, tym razem wielkość liter nie grała roli przy porównywaniu kluczy.

<h3>array_intersect_uassoc</h3>
Kolejna bardzo podobna funkcja do omawianych dotychczas. Wylicza ona część wspólną z dodatkowym sprawdzaniem kluczy, przy czym owo sprawdzanie odbywa się na podstawie funkcji dostarczonej przez użytkownika. Sprawdzanie wartości przebiega natomiast w taki sam sposób jak w przypadku <strong>array_intersect</strong>.

<div class='stb-info_box' >
array <strong>array_intersect_uassoc</strong>(array $array1, array $array2 [, array $ ...], callback $key_cmp_func)
</div>

<h3>array_intersect_ukey</h3>
<div class='stb-info_box' >
array <strong>array_intersect_ukey</strong>(array $array1, array $array2 [, array $ ...], callback $key_cmp_func)
</div>

Ostatnia z rodziny <strong>array_intersect</strong> funkcja wylicza część wspólną porównując ze sobą tylko klucze, przy czym samo porównanie odbywa się za pomocą funkcji dostarczonej przez użytkownika. Rozważmy taki kod:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Almodovar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'b'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Bridges'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'c'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Cooper'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'d'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Depp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'ALMODOVAR'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'b'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Bacon'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'C'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Christopherson'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'z'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Depp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_intersect_ukey</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array2</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'strcasecmp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




W wyniku dostajemy:

<pre>
<code>
Array
(
    [a] => Almodovar
    [b] => Bridges
    [c] => Cooper
)
</code>
</pre>

Jak widać funkcja nie dba o to jakie są wartości &#8211; liczą się tylko klucze. Dodatkowo zgodność kluczy sprawdzana jest za pomocą funkcji <strong>strcasecmp</strong> dlatego element: <code>'c' => 'Cooper'</code> zaliczany jest do części wspólnej &#8211; w tablicy <code>$array2</code> również występuje klucz &#8216;C&#8217; (wielkość liter nie ma znaczenia, dzięki użyciu <strong>strcasecmp</strong>), to nic, że przypisana jest do niego inna wartość, <strong>array_intersect_ukey</strong> bierze pod uwagę tylko klucze, pamiętasz? <img src='http://tomek.rychtyk.pl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ]]></content:encoded>
			<wfw:commentRss>http://tomek.rychtyk.pl/blog/2012/01/22/tablice-jako-stosty-kolejki-lub-zbiory-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tablice jako stosy, kolejki lub zbiory #1</title>
		<link>http://tomek.rychtyk.pl/blog/2012/01/21/tablice-jako-stosy-i-kolejki/</link>
		<comments>http://tomek.rychtyk.pl/blog/2012/01/21/tablice-jako-stosy-i-kolejki/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 20:35:39 +0000</pubDate>
		<dc:creator>vonski</dc:creator>
				<category><![CDATA[Notatki do ZCE]]></category>
		<category><![CDATA[Tablice]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tablice]]></category>
		<category><![CDATA[zce]]></category>

		<guid isPermaLink="false">http://tomek.rychtyk.pl/blog/?p=411</guid>
		<description><![CDATA[Tablice często używane są jako stosy (LIFO &#8211; Last In First Out) lub kolejki (FIFO &#8211; First In First Out). PHP bardzo upraszcza nam to podejście do tablic dostarczając zestawu funkcji wyciągania i wkładania poszczególnych elementów ze stosów / kolejek. Do tego czasem zachodzi potrzeba potraktować tablice jako zbiory danych. Tutaj też twórcy języka usprawniają [...]]]></description>
			<content:encoded><![CDATA[<a href="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png"><img src="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png" alt="" title="1289946386_folder_black_PHP" width="128" height="105" class="alignleft size-full wp-image-307" /></a>Tablice często używane są jako stosy (<strong>LIFO &#8211; Last In First Out</strong>) lub kolejki (<strong>FIFO &#8211; First In First Out</strong>). <strong>PHP</strong> bardzo upraszcza nam to podejście do tablic dostarczając zestawu funkcji wyciągania i wkładania poszczególnych elementów ze stosów / kolejek.
Do tego czasem zachodzi potrzeba potraktować tablice jako zbiory danych. Tutaj też twórcy języka usprawniają nam pracę dostarczając odpowiednich metod.

<span id="more-411"></span>

<h2>Stosy</h2>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$stack</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">array_push</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$stack</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'foo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'baz'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$stack</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$last_in</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_pop</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$stack</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Last in:'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$last_in</span><span style="color: #339933;">;</span></pre></div></div>




Powyższy kod wyświetli nam:
<pre>
<code>
Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
</code>
</pre>
<pre>
<code>
Last in:baz
</code>
</pre>
Bajecznie proste <img src='http://tomek.rychtyk.pl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Jak widać, by operować na tablicy jak na stosie potrzebujemy dwóch funkcji: <strong>array_push()</strong> oraz <strong>array_pop()</strong>.

<h3>array_push()</h3>

<div class='stb-info_box' >int <strong>array_push</strong> (array &#038;$array, mixed $var [, mixed $...])</div>

Funkcja ta traktuje tablicę <strong>$array</strong> jak stos i &#8222;wpycha&#8221; podane elementy na jej koniec. Tak naprawdę, daje to taki sam efekt jakbyśmy napisali:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$stack</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'foo'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$stack</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'bar'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$stack</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'baz'</span><span style="color: #339933;">;</span></pre></div></div>




Ale jak nie od dziś wiadomo, PHP lubi upraszczać nam kodowanie na każdym kroku <img src='http://tomek.rychtyk.pl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> 
Jest jednak drobna różnica między powyższym sposobem &#8222;upychania&#8221; elementów do tablicy (za pomocą operatora tablicowego []) a <strong>array_push()</strong>. Zakładając, że <strong>$stack</strong> nie jest tablicą, to pisząc coś takiego: <strong> $stack[] = &#8216;foo&#8217;;</strong>, PHP przekonwertuje <strong>$stack</strong> do typu tablicowego. <strong>array_push()</strong> natomiast wygeneruje ostrzeżenie jeśli pierwszy przekazany do niej argument nie jest tablicą.
Wartość zwracana przez funkcję to nowa, aktualna ilość elementów w tablicy.

<div class='stb-warning_box' >Jeśli używasz <strong>array_push()</strong> do dodania do tablicy tylko jednego elementu &#8211; powinieneś zamiast niej użyć zwykłego operatora []. Co prawda <strong>array_push()</strong> umożliwia taką operację, jednak jest to nieopłacalne z perspektywy wydajności skryptu. Po prostu to samo można osiągnąć używając operatora [],  a do tego podczas dodawania elementu nie jest wywoływana żadna funkcja.
</div>

<h3>array_pop()</h3>

<div class='stb-info_box' >mixed <strong>array_pop</strong> (&#038;$array)</div>

Ta funkcja z kolei zwraca ostatni element z tablicy oraz usuwa go z niej. Jeśli tablica jest pusta zostanie zwrócony <strong>NULL</strong>. Natomiast jeśli funkcja zostanie wywołana dla zmiennej nietablicowej, zostanie wygenerowane ostrzeżenie i także zwrócona wartość <strong>NULL</strong>.

<h2>Kolejki</h2>

Jeśli zdecydujemy się traktować tablice jak kolejki, możemy użyć funkcji <strong>array_unshift()</strong> do dodawania elementów na początku tablicy oraz <strong>array_shift()</strong> do ich usuwania z początku tablicy.


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$stack</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'qux'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'baz'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$first_element</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_shift</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$stack</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'First: '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$first_element</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">array_unshift</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$stack</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'foo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'sally'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$stack</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Kod ten wyświetli:

<pre>
<code>
First: qux
Array
(
    [0] => foo
    [1] => sally
    [2] => bar
    [3] => baz
)
</code>
</pre>

<h3>array_unshift()</h3>

<div class='stb-info_box' >int <strong>array_unshift</strong> (&#038;$array, mixed $var [, mixed $...])</div>

Funkcja ta dodaje element lub elementy na początku tablicy. Wszystkie klucze numeryczne są kasowane i elementy są numerowane od początku, zaczynając od zera. Klucze asocjacyjne nie są modyfikowane. Funkcja zwraca nową, aktualną ilość elementów w tablicy. Jeśli jako pierwszy argument nie przekażemy tablicy, <strong>array_unshift()</strong> wygeneruje ostrzeżenie i zwróci <strong>NULL</strong>.

<h3>array_shift()</h3>

<div class='stb-info_box' >mixed <strong>array_shift</strong> (array &#038;$array)</div>

Działanie tej funkcji jest analogiczne do <strong>array_pop()</strong> tylko że o ile tamta zwracała i usuwała ostatni element tablicy, o tyle ta zwraca i usuwa pierwszy element tablicy. Trzeba jeszcze dodać, że wszystkie klucze numeryczne będą skasowane i tablica będzie indeksowana od zera. Klucze asocjacyjne nie są ruszane.

<h3>array_pad()</h3>

Pisząc o operacjach przycinania tablicy to na początku, to na końcu, dodawania elementów itp. przypomniały mi się jeszcze dwie funkcje, które też niejako mogą przydać się w tego typu operacjach. Pierwszą z nich jest <strong>array_pad()</strong> czyli dopełnienie tablicy.

<div class='stb-info_box' >array <strong>array_pad</strong> (array $input, int $pad_size, mixed $pad_value)</div>

Funkcja ta jest bardzo prosta w użyciu i nieskomplikowana w działaniu. Najprościej mówiąc, dopełnia ona tablicę <strong>$input</strong> do rozmiaru zdefiniowanego przez <strong>$pad_size</strong> wartością <strong>$pad_value</strong>. Jeśli <strong>$pad_size</strong> jest dodatnie, wówczas tablica dopełniana jest do prawej, jeśli ujemne &#8211; do lewej. Natomiast jeśli wartość bezwzględna <strong>$pad_size</strong> jest mniejsza lub równa rozmiarowi tablicy <strong>$input</strong> nie zachodzi żadne dopełnianie.
Jak widać na powyższej definicji, funkcja <strong>array_pad()</strong> nie pracuje na oryginalnej tablicy, tylko na jej kopii, toteż wartością przez nią zwracaną jest dopełniona tablica. Jeśli natomiast podamy jej w pierwszym argumencie zmienną inną niż tablica, zostanie wygenerowane ostrzeżenie oraz zwrócona wartość <strong>NULL</strong>.

<h3>array_fill()</h3>

<div class='stb-info_box' >array <strong>array_fill</strong>(int $index, int $num, mixed $value)</div>

Funkcja <strong>array_fill()</strong> jak widać nie wymaga od nas podania żadnej tablicy. Generuje ona natomiast tablicę na podstawie wytycznych, które jej podamy. Są to: indeks, od którego ma się zacząć numeracja elementów, czyli parametr <strong>$index</strong>. Następnie podajemy ilość elementów (<strong>$num</strong>) oraz wartość, jaką chcemy wypełnić tablicę. Działa to mniej więcej tak:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_fill</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'sally'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Kod wyświetli:

<pre>
<code>
Array
(
    [5] => sally
    [6] => sally
    [7] => sally
    [8] => sally
    [9] => sally
    [10] => sally
    [11] => sally
    [12] => sally
    [13] => sally
    [14] => sally
)
</code>
</pre>

Funkcja <strong>array_fill()</strong> wygeneruje błąd poziomu <strong>E_WARNING</strong> jeśli parametr określający ilość elementów (<strong>$num</strong>) jest mniejszy od zera.

<h2>Zbiory</h2>

Niektóre pehapowe funkcje zostały zaprojektowane specjalnie do operowania na tablicach traktując je jako zbiory danych. I tak na początek mamy funkcję <strong>array_diff()</strong>, która zwraca nam różnicę dwóch, lub więcej tablic.

<h3>array_diff()</h3>

<div class='stb-info_box' >array <strong>array_diff</strong>(array $array1, array $array2 [, array $...])</div>

Funkcja porównuje <strong>$array1</strong> z <strong>$array2</strong> i zwraca różnicę również w postaci tablicy. Możemy przekazać też więcej niż jedną tablicę do porównania, wówczas dostaniemy tablicę elementów niewystępujących w żadnej z podanych tablic.


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">8</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">9</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bar'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">8</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">9</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$wynik</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_diff</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span><span style="color: #000088;">$b</span><span style="color: #339933;">,</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$wynik</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Wyświetli:

<pre>
<code>
Array
(
    [3] => 4
    [6] => 7
    [9] => 10
)
</code>
</pre>

Zauważmy, że funkcja ignoruje podczas porównywania klucze. Jeśli chcesz sprawdzać różnicę na zasadzie par <storng>klucz => wartość</strong> powinieneś użyć funkcji <strong>array_diff_assoc()</strong>.

<h3>array_diff_assoc()</h3>

<div class='stb-info_box' >array <strong>array_diff_assoc</strong>(array $array1, array $array2 [, array $...])</div>

Działa na podobnej zasadzie co opisywana wyżej funkcja z tą różnicą, że ta bierze pod uwagę dodatkowo zgodność kluczy.


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'bar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'baz'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'bar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bar'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'bar'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$wynik</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_diff_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$wynik</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Kod ten pokaże na ekranie:

<pre>
<code>
Array
(
    [foo] => bar
    [baz] => bar
    [1] => bar
)
</code>
</pre>

<h3>array_diff_key</h3>
Funkcja ta, podobnie jak dwie powyższe, wylicza różnicę tablic i zwraca ją w postaci oddzielnej tablicy, jednak przy porównywaniu elementów, bierze ona pod uwagę nie wartości, a klucze.

<div class='stb-info_box' >
array <strong>array_diff_key</strong>(array $array1, array $array2 [, array $ ...])
</div>

<h3>array_udiff()</h3>

Jeżeli ktoś myślał, że wymienione trzy funkcje to wszystko, co <strong>PHP</strong> nam dostarcza do wyliczania różnic między tablicami, to był w dużym błędzie. Poza tymi dwoma, powiedzmy, podstawowymi funkcjami, dostajemy jeszcze szereg innych funkcji umożliwiających nam definiowanie własnych sposobów porównywania elementów. Jedną z nich jest funkcja <strong>array_udiff()</strong>.

<div class='stb-info_box' >array <strong>array_udiff</strong>(array $array1, array $array2 [, array $...], callback $data_compare_func)</div>

Kiedy jej używamy? W momencie, kiedy potrzebny jest nam bardziej złożony mechanizm porównywania tablic, niż ten, który dostarcza PHP. Jednym z takich przypadków będzie np. taki, kiedy musimy porównać ze sobą dwie tablice różniące się wymiarem. Rozważmy taki kod:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> compr<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$aVal</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nazwisko'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$bVal</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$b</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nazwisko'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">strcmp</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aVal</span><span style="color: #339933;">,</span> <span style="color: #000088;">$bVal</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$aktorzy</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'imie'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Tom'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'nazwisko'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'imie'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Jack'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'nazwisko'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Nicholson'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'imie'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Brad'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'nazwisko'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Pitt'</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$nazwiska</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pazura'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pitt'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_udiff</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aktorzy</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nazwiska</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'compr'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Mamy dwie tablice: dwuwymiarową <code>$aktorzy</code> i jednowymiarową <code>$nazwiska</code>. Powiedzmy, że chcę z tablicy <code>$aktorzy</code> wybrać tylko te tablice, których element o kluczu &#8216;nazwisko&#8217; nie pokrywa się z żadnym elementem tablicy <code>$nazwiska</code>. Wiadomo, że można pokombinować w &#8222;normalny&#8221; sposób &#8211; zagnieździć kilka pętli, dołożyć kilka if&#8217;ów i osiągniemy ten efekt. Pytanie tylko &#8211; po co? Powyższy kod robi dokładnie to, co opisałem, mianowicie wyświetli on:

<pre>
<code>
Array
(
    [1] => Array
        (
            [imie] => Jack
            [nazwisko] => Nicholson
        )

)
</code>
</pre>

Dlaczego? A no dlatego, że tylko Nicholsona nie ma w tablicy <code>$nazwiska</code>. A teraz pytanie? Co mi się wyświetli, jeśli w wywołaniu <strong>array_udiff</strong> zamienię kolejnością porównywane tablice? Myślę, że jeśli zrozumiałeś na powyższym przykładzie o co chodzi w działaniu tej funkcji, już znasz odpowiedź, jeśli nie &#8211; sam sprawdź, ja nie powiem <img src='http://tomek.rychtyk.pl/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> 

<h3>array_udiff_assoc</h3>

<div class='stb-info_box' >array <strong>array_udiff_assoc</strong>(array $array1, array $array2 [, array $...], callback $data_compare_func)</div>

Ta funkcja działa bardzo podobnie do powyższej, z tą różnicą, że podczas porównanie bierze pod uwagę również zgodność kluczy porównywanych elementów.<br />
Posłużę się kodem z powyższego przykładu, tylko zamienię <strong>array_diff</strong> na <strong>array_diff_assoc</strong>.


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> compr<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$aVal</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nazwisko'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$bVal</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$b</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nazwisko'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">strcmp</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aVal</span><span style="color: #339933;">,</span> <span style="color: #000088;">$bVal</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$aktorzy</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'imie'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Tom'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'nazwisko'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'imie'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Jack'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'nazwisko'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Nicholson'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'imie'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Brad'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'nazwisko'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Pitt'</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$nazwiska</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pazura'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pitt'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_udiff_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aktorzy</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nazwiska</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'compr'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Kod ten wyświetli dokładnie to samo co w przypadku <strong>array_diff</strong>. Dlaczego? W tablicy dwuwymiarowej element przypisany do Toma Cruisea ma indeks równy zero, tak samo jak element o wartości &#8216;Cruise&#8217; w tablicy <code>$nazwiska</code>. Podobnie sprawa wygląda z Bradem Pittem. Jego indeks równy jest dwa zarówno w pierwszej jak i w drugiej tablicy. Zmodyfikujmy więc nieco tablicę <code>$nazwiska</code>:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> compr<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$aVal</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nazwisko'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$bVal</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$b</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nazwisko'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">strcmp</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aVal</span><span style="color: #339933;">,</span> <span style="color: #000088;">$bVal</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$aktorzy</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'imie'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Tom'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'nazwisko'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Cruise'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'imie'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Jack'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'nazwisko'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Nicholson'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'imie'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Bradd'</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'nazwisko'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Pitt'</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$nazwiska</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Cruise'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Pazura'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'trzeci'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Pitt'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_udiff_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aktorzy</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nazwiska</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'compr'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Teraz wynik będzie się różnił, mianowicie wygląda on tak:

<pre>
<code>
Array
(
    [1] => Array
        (
            [imie] => Jack
            [nazwisko] => Nicholson
        )

    [2] => Array
        (
            [imie] => Bradd
            [nazwisko] => Pitt
        )

)
</code>
</pre>

O ile, nazwisko &#8216;Pitt&#8217; się zgadza zarówno w pierwszej jak i drugiej tablicy, o tyle klucze już są inne.

<h3>array_udiff_uassoc</h3>

<div class='stb-info_box' >
array <strong>array_udiff_uassoc</strong>(array $array1, array $array2 [, array $ ...], callback $data_compare_function, callback $key_compare_function)
</div>

Funkcja ta działa na takiej samej zasadzie jak dwie poprzednie, z tą różnicą, że pozwala ona zdefiniować dwie oddzielne metody &#8211; jedną do porównywania wartości, drugą do kluczy. Myślę, że jeśli zrozumiałeś o co chodzi na dwóch poprzednich przykładach, to nie potrzeba się zagłębiać w jej działanie <img src='http://tomek.rychtyk.pl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> 

<h3>array_diff_ukey</h3>

<div class='stb-info_box' >
array <strong>array_diff_ukey</strong>(array $array1, array $array2 [, array $ ... ], callback $key_compare_func)
</div>

Po raz kolejny, bardzo podobna w działaniu funkcja co wcześniej opisane. <strong>array_diff_ukey</strong> przy porównaniu bierze pod uwagę tylko klucze, a samo porównanie wykonywane jest za pomocą funkcji dostarczonej przez użytkownika.

<h3>array_diff_uassoc</h3>

<div class='stb-info_box' >
array <strong>array_diff_uassoc</strong>(array $array1, array $array2 [, array $ ... ], callback $key_compare_func)
</div>

Ostatnia funkcja z rodziny wyliczających różnicę zbiorów <img src='http://tomek.rychtyk.pl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Jej działanie jest niemalże identyczne do <strong>array_diff_assoc</strong> tzn. funkcja przy porównaniu kieruje się wartościami i dodatkowo sprawdza zgodność kluczy, z tym że owo sprawdzanie zgodności kluczy odbywa się za pomocą funkcji użytkownika.
<br /><br />
Na tym kończę ten wpis, jednak nie kończę jeszcze tematu zbiorów. Omówiłem funkcje obliczające różnicę, a co z częścią wspólną? <img src='http://tomek.rychtyk.pl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Do jej wyznaczania służy <strong>array_intersect</strong> i podobnie jak w przypadku <strong>array_diff</strong> występuje kilka jej odmian, dlatego postanowiłem poświęcić jej <a href="http://tomek.rychtyk.pl/blog/2012/01/22/tablice-jako-stosty-kolejki-lub-zbiory-2/" title="Tablice jako stosy, kolejki lub zbiory #2">oddzielny wpis</a>.<br />]]></content:encoded>
			<wfw:commentRss>http://tomek.rychtyk.pl/blog/2012/01/21/tablice-jako-stosy-i-kolejki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Konstrukcje jezykowe</title>
		<link>http://tomek.rychtyk.pl/blog/2011/01/08/konstrukcje-jezykowe/</link>
		<comments>http://tomek.rychtyk.pl/blog/2011/01/08/konstrukcje-jezykowe/#comments</comments>
		<pubDate>Sat, 08 Jan 2011 17:41:19 +0000</pubDate>
		<dc:creator>vonski</dc:creator>
				<category><![CDATA[Notatki do ZCE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Podstawy]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zce]]></category>

		<guid isPermaLink="false">http://tomek.rychtyk.pl/blog/?p=413</guid>
		<description><![CDATA[Konstrukcje językowe są elementami wbudowanymi w język, dlatego też kierują się specjalnymi regułami. Najbardziej znaną konstrukcją jest prawdopodobnie echo, służące do wypisywania tekstu na ekran. Należy sobie zdać sprawę, że echo nie jest funkcją, dlatego nie zwraca żadnej wartości. Alternatywnie można skorzystać z print, która, mimo tego że jest również konstrukcją językową, to posiada pewne [...]]]></description>
			<content:encoded><![CDATA[<a href="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png"><img src="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png" alt="" title="1289946386_folder_black_PHP" width="128" height="105" class="alignleft size-full wp-image-307" /></a>Konstrukcje językowe są elementami wbudowanymi w język, dlatego też kierują się specjalnymi regułami. Najbardziej znaną konstrukcją jest prawdopodobnie <strong>echo</strong>, służące do wypisywania tekstu na ekran. Należy sobie zdać sprawę, że <strong>echo </strong>nie jest funkcją, dlatego nie zwraca żadnej wartości. Alternatywnie można skorzystać z <strong>print</strong>, która, mimo tego że jest również konstrukcją językową, to posiada pewne cechy funkcji &#8211; zwraca wartość oraz może być użyta jako część wyrażenia.

<span id="more-413"></span>

<h2>echo i print</h2>

<div class='stb-info_box' >int <strong>print </strong>(string <em>$arg</em>)</div>

Jako że nie jest to funkcja, argument <strong>$arg</strong> można przekazać także bez nawiasów (co tak naprawdę jest zalecane). <strong>print() </strong>zawsze zwraca w wyniku swojego działania wartość 1.

<div class='stb-info_box' >void <strong>echo</strong> (string $arg1 [, string $...])</div>

Jak widać <strong>echo</strong> różni się nieco od swojej kuznki <strong>print</strong>. Po pierwsze nie zwraca żadnej wartości. Po drugie, nie zawsze można je użyć jako część wyrażenia. Np.


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">'Foo'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// zapis poprawny, wyświetli: Foo</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Bar'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// błąd składni</span></pre></div></div>




Z powyższej definicji wynika również, że do echo można przekazać kilka parametrów oddzielonych przecinkami. Jeśli zdecydujemy się na taki zapis, należy pamiętać, że parametry te powinniśmy podać BEZ nawiasów, inaczej dostaniemy błąd składni.

<h2>die() i exit()</h2>

Inną ważną konstrukcją językową jest <strong>die()</strong>, będąca tak naprawdę aliasem dla <strong>exit()</strong>.

<div class='stb-info_box' >void <strong>die</strong> ([string $status])<br />
void <strong>exit</strong> (int $status)</div>

Powoduje ona przerwanie wykonywania skryptu. Opcjonalnie można podać jej jako argument komunikat, który ma być wypisany zaraz przed zakończeniem, lub liczbę całkowitą (tzw. status wyjściowy programu), która nie zostanie wyświetlona na ekranie, ale zostanie przekazana do procesu, który wywołał nasz skrypt.

<h2>array()</h2>

Programując aplikacje internetowe niejednokrotnie natrafisz na konieczność użycia tablicy. Jednym ze sposobów stworzenia takowej jest kolejna konstrukcja &#8211; <strong>array()</strong>. Zwraca ona tablicę z podanych parametrów.

<div class='stb-info_box' >array <strong>array</strong> ([mixed $...])</div>

A oto przykład użycia tej konstrukcji:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$myTable</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;a&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;b&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;c&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;d&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;e&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$myTable</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Powyższy kod wyświetli:

<pre>
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
)
</pre>

Zauważ, że mimo tego, iż nie podaliśmy indeksów tablicy, <strong>PHP </strong>domyślnie zrobił to za nas. Jak zdefiniować swoje własne indeksy? Poprzez podanie do <strong>array() </strong>pary: <strong>klucz => wartość</strong>, czyli:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$myTab</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;drugi&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">244</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">&quot;czwarty&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">54</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;php&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;moja_nazwa&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;wartosc&quot;</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1299</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">65</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">34</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;moja_nazwa&quot;</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$myTab</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Ten przykład wyświetli:

<pre>
Array
(
    [1] => 1
    [2] => drugi
    [3] => 244
    [4] => czwarty
    [5] => 54
    [6] => php
    [moja_nazwa] => 100
    [1299] => 65
    [1300] => 34
)

</pre>

Jest tu kilka ciekawostek. Po pierwsze, przypatrz się dokładnie w jaki sposób <strong>PHP </strong>indeksuje elementy tablicy, gdy klucze nie są jawnie podane. Zaczynamy od klucza 1, któremu przypisujemy wartość 1. Później jest drugi, trzeci i czwarty klucz wraz z odpowiadającymi im wartościami. Natomiast piąty element podany w <strong>array()</strong> jest bez klucza. Biorąc pod uwagę, że tablica jest indeksowana od zera (nie od jeden!), natomiast my zaczęliśmy od indeksu numer 1, więc przed jedynką mamy w pewnym sensie wolne miejsce. Co zrobi <strong>PHP</strong>? Jak widać, tworzy sobie kolejny klucz, ale o wartości 5. Tak, tak. Podczas tworzenia domyślnych kluczy numerycznych PHP sprawdza wartość największego klucza, dodaje do niego wartość jeden i tworzy indeks o powstałym numerze. Widać to dobrze później. Dla elementu o wartości 65 ustalamy indeks 1299, następny element, któremu nie przypisujemy jawnie klucza, ma indeks 1300.
Zwróć jeszcze uwagę, że przy podaniu dwóch takich samych kluczy, wartość poprzednia jest nadpisywana (vide klucz &#8222;moja_nazwa&#8221;).
Nie będę się tu na razie więcej rozpisywał, gdyż tablice to tak obszerny temat, że szczegółowo zostaną omówione w osobnym rozdziale poświęconym tylko i wyłącznie im.

<h2>isset()</h2>

Jedną z najbardziej przydatnych konstrukcji językowych jest <strong>isset()</strong>

<div class='stb-info_box' >bool <strong>isset</strong> (mixed $var [, mixed $var1 [, $... ]])</div>

Służy ona do sprawdzania, czy zmienna jest zainicjowana. Zwraca <strong>FALSE</strong> jeśli zmienna ma wartość <strong>NULL</strong>. Więcej o sprawdzaniu wartości zmiennych napiszę w osobnym wpisie <strong>Porównywanie i sprawdzanie wartości zmiennych</strong>, bo myślę, że jest to dość ważna sprawa i wcale nie taka prosta, jakby się mogło wydawać.
Jak widać, do <strong>isset()</strong> można przekazać więcej niż jeden parametr. <strong>isset()</strong> zwróci <strong>TRUE</strong> tylko wtedy, kiedy wszystkie przekazane wartości będą ustawione.
Jako że jest to konstrukcja językowa, a nie funkcja, trzeba pamiętać, że nie można się do niej odnieść za pomocą zmiennej. Np.


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;isset&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// wyświetli komunikat o błędzie: &quot;Fatal error: Call to undefined function isset()...&quot;</span></pre></div></div>




<h2>empty()</h2>

Podobne zastosowanie do powyższej ma konstrukcja <strong>empty()</strong>. Jak sama nazwa wskazuje, sprawdzamy nią czy zmienna jest pusta. Mogłoby się wydawać, że jest ona przeciwieństwem <strong>isset()</strong>, tak jednak nie jest, o czym więcej powiem w <strong>Porównywaniu i sprawdzaniu wartości zmiennych</strong>.

<div class='stb-info_box' >bool <strong>empty</strong> (mixed $var)</div>

Można powiedzieć natomiast, że <strong>empty()</strong> jest przeciwieństwem boolowskiego <strong>if($var)</strong>.
Oto list wartości, które są postrzegane jako puste (czyli dla których <strong>empty()</strong> zwróci <strong>TRUE</strong>):
<strong>&#8222;&#8221;</strong> lub <strong>&#8221;</strong> (pusty string)
<strong>0</strong> (0 jako int)
<strong>&#8222;0&#8243;</strong> (0 jako string)
<strong>NULL</strong>
<strong>FALSE</strong>
<strong>array()</strong> (pusta tablica)
<strong>var $var</strong> (zmienna zadeklarowana, ale bez żadnej przypisanej wartości)

<div class='stb-warning_box' >Uwaga dla tych, którzy orientują się już co nieco w programowaniu obiektowym. Od <strong>PHP 5</strong> obiekty nieposiadające żadnych właściwości nie są postrzegane jako puste.</div>

<h2>list()</h2>

Ciekawą i również w niektórych sytuacjach przydatną konstrukcją jest <strong>list()</strong>:

<div class='stb-info_box' >array <strong>list</strong> (mixed $varname [, mixed $...])</div>

Używana jest do przypisania kilku zmiennych w jednej operacji.


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$info</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'coffee'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'brown'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'caffeine'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$drink</span><span style="color: #339933;">,</span> <span style="color: #000088;">$color</span><span style="color: #339933;">,</span> <span style="color: #000088;">$power</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$info</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$drink</span> is <span style="color: #006699; font-weight: bold;">$color</span> and <span style="color: #006699; font-weight: bold;">$power</span> makes it special.&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// wyświetli: coffee is brown and caffeine makes it special.</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// można też użyć list() do przypisania tylko kilku zmiennych</span>
<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$drink</span><span style="color: #339933;">,</span> <span style="color: #339933;">,</span> <span style="color: #000088;">$power</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$info</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$drink</span> has <span style="color: #006699; font-weight: bold;">$power</span>.&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// wyświetli: coffee has caffeine</span></pre></div></div>




Konstrukcja ta zwraca tablicę przypisanych wartości.

<h2>include, require, include_once i require_once</h2>

Czasami zachodzi potrzeba dołączenia do skryptu jakiegoś zewnętrznego pliku. W tym wypadku z pomocą przychodzą nam aż cztery konstrukcje działające bardzo podobnie. Są to: <strong>include</strong>, <strong>include_once</strong>, <strong>require</strong> i <strong>require_once</strong>.
Jak jest różnica między <strong>include</strong> a <strong>require</strong>? Taka sama jak między <strong>include_once</strong>, a <strong>require_once</strong> <img src='http://tomek.rychtyk.pl/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> 
A poważnie mówiąc, konstrukcja <strong>include</strong> dołącza zewnętrzny plik na podstawie ścieżki do pliku, którą jej przekazujemy. Na tym etapie <strong>require</strong> działa tak samo. Jednak gdy plik nie zostanie odnaleziony, <strong>include</strong> wygeneruje <strong>WARNING</strong> i nie przerwie działania skryptu, podczas gdy <strong>require</strong> wygeneruje <strong>FATAL_ERROR</strong> i przerwie wykonywanie skryptu (jak sama nazwa wskazuje, require = wymagaj).
Pliki dołączane są na podstawie ścieżki &#8211; relatywnej, albo bezwzględnej &#8211; lub jeśli nie jest ona podana, szukane są w katalogu, na który wskazuje ścieżka <strong>include_path</strong> zdefiniowana w pliku <strong>php.ini</strong>. Jeśli i tam nie znajdzie pliku, skrypt ostatecznie szuka pliku w katalogu, z którego został wywołany.
Podczas gdy plik jest dołączany, skrypt przechodzi z trybu <strong>PHP</strong> do trybu <strong>HTML</strong>, dołącza plik, wykonuje go i na końcu znowu przechodzi do trybu <strong>PHP</strong> dlatego jeśli w dołączanym pliku znajduje się jakiś kod <strong>PHP</strong> pamiętajmy, aby umieścić go w znacznikach: <strong>&lt;?php ?&gt;</strong>

<strong>include_once</strong> i <strong>require_once</strong> działają prawie identycznie z tą różnicą, że przed dołączeniem pliku, skrypt sprawdza, czy dany plik nie był dołączony wcześniej. Jeśli był, nie dołączy go drugi raz.

<h2>eval()</h2>

<div class='stb-info_box' >mixed <strong>eval</strong> (string $code_str)</div>

Konstrukcja <strong>eval()</strong> traktuje łańcuch znakowy jak kod <strong>PHP</strong> i wykonuje go. Jest to przydatne w przypadku kiedy np. przechowujemy w bazie danych kod do późniejszego wykonania w postaci tekstu.

Przykład działania:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">eval</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'if($b == 1) $a = 10;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// wypisze: 10</span></pre></div></div>




<strong>eval()</strong> zwraca <strong>NULL</strong> chyba, że w wykonywanym kodzie nastąpiło wywołanie <strong>return</strong> &#8211; wówczas zostanie zwrócona wartość przekazana do <strong>return</strong>. W przypadku błędu <strong>eval()</strong> zwraca <strong>FALSE</strong>.

<h2>return</h2>

Jeśli <strong>return</strong> zostanie wywołane z wnętrza funkcji, konstrukcja natychmiastowo przerwie jej działanie i zwróci wartość podaną w argumencie. <strong>return</strong> kończy również wykonywanie instrukcji <strong>eval()</strong>, lub ogólnie skryptu.

Przykład <strong>return</strong> w funkcji:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> myFoo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// jakieś operacje</span>
<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// wszystkie operacje napisane poniżej return nie zostaną wykonane</span>
<span style="color: #009900;">&#125;</span></pre></div></div>




Przykład zakończenia skryptu:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #666666; font-style: italic;">// jakieś operacje</span>
&nbsp;
<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// jakieś inne operacje - nie zostaną wykonane</span></pre></div></div>




Powyższy przykład ilustruje wywołanie return w przestrzeni globalnej skryptu. A teraz wyobraź sobie taką sytuację. Do skryptu <strong>foo.php</strong> dołączyłeś inny skrypt <strong>bar.php</strong>. W pliku <strong>bar.php</strong> jest wywołanie <strong>return</strong> w przestrzeni globalnej. Czy takie wywołanie zakończy wykonanie obu skryptów, czy tylko tego, który dołączyliśmy? Myślę, że pytanie dobre na egzamin ZCE <img src='http://tomek.rychtyk.pl/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Otóż zostanie zakończony tylko skrypt <strong>bar.php</strong> a sterowanie zostanie oddane z powrotem do skryptu dołączającego. Dodatkowo, jeśli w skrypcie <strong>bar.php</strong> podaliśmy do <strong>return</strong> jakiś argument, wówczas będzie on wartością zwróconą przez instrukcję dołączającą. Np:

<storng>foo.php</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #b1b100;">include</span> <span style="color: #0000ff;">'bar.php'</span><span style="color: #339933;">;</span></pre></div></div>




<strong>bar.php</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// cośtam sobie robimy...</span>
&nbsp;
<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span></pre></div></div>




W takim wypadku wartość zmiennej <strong>$a</strong> w pliku <strong>foo.php</strong> przyjmie wartość <strong>10</strong>.
Jako że <strong>return</strong> jest konstrukcją językową, a nie funkcją, możemy pominąć nawiasy podczas jej wywołania i szczerze mówiąc, jest to zalecane, gdyż <strong>PHP</strong> ma wtedy mniej pracy podczas parsowania skryptu. Jeśli natomiast nie zwracamy żadnej wartości (chcemy po prostu zakończyć funkcję), wtedy nawiasy <strong>muszą</strong> być ominięte.  Taki zapis: <strong>return();</strong> wygeneruje błąd.

Uważaj podczas zwracania tablic za pomocą <strong>return</strong>. <strong>Tablica przed zwróceniem powinna być zawsze zadeklarowana</strong>. Popatrz na poniższy kod:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> myFoo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'foo'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'bar'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> myFoo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Wynikiem działania będzie:
<code>string(3) "bar" </code>
]]></content:encoded>
			<wfw:commentRss>http://tomek.rychtyk.pl/blog/2011/01/08/konstrukcje-jezykowe/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Anty-sort, czyli robienie bałaganu w tablicy</title>
		<link>http://tomek.rychtyk.pl/blog/2011/01/03/anty-sort-czyli-robienie-balaganu-w-tablicy/</link>
		<comments>http://tomek.rychtyk.pl/blog/2011/01/03/anty-sort-czyli-robienie-balaganu-w-tablicy/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 23:09:52 +0000</pubDate>
		<dc:creator>vonski</dc:creator>
				<category><![CDATA[Notatki do ZCE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tablice]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tablice]]></category>
		<category><![CDATA[zce]]></category>

		<guid isPermaLink="false">http://tomek.rychtyk.pl/blog/?p=409</guid>
		<description><![CDATA[Niedawno w Notatkach spisałem się na temat sortowania tablic. Są jednak takie sytuacje, w których potrzebujemy troszkę namieszać w tablicy &#8211; czyli wykonać dokładnie odwrotność sortowania. Jak zwykle PHP spieszy z pomocą dostarczając nam gotowej funkcji realizującej to zadanie. Funkcja ta zwie się shuffle(). Jak zwykle na początek szybki wgląd w dokumentację, cobyśmy wiedzieli z [...]]]></description>
			<content:encoded><![CDATA[<a href="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png"><img src="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png" alt="" title="1289946386_folder_black_PHP" width="128" height="105" class="alignleft size-full wp-image-307" /></a>Niedawno w <strong>Notatkach</strong> spisałem się na temat sortowania tablic. Są jednak takie sytuacje, w których potrzebujemy troszkę namieszać w tablicy &#8211; czyli wykonać dokładnie odwrotność sortowania. Jak zwykle PHP spieszy z pomocą dostarczając nam gotowej funkcji realizującej to zadanie. Funkcja ta zwie się <strong>shuffle()</strong>.

<span id="more-409"></span>

Jak zwykle na początek szybki wgląd w dokumentację, cobyśmy wiedzieli z czym mamy do czynienia:

<div class='stb-info_box' >bool <strong>shuffle</strong> (array &#038;$array)</div>

Użycie funkcji jest bardzo proste:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$arr</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">15</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'foo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'baz'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'bar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'sally'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'betty'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">18</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">shuffle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arr</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arr</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




I to wszystko. Zauważmy, że <strong>shuffle()</strong> bierze tablicę przez referencję przez co operuje bezpośrednio na niej. Powyższy skrypt wyświetli coś w tym stylu (piszę &#8222;coś w tym stylu&#8221;, bo za każdym razem <strong>shuffle()</strong> miesza tablicę w inny sposób):

Array
(
    [0] => foo
    [1] => 15
    [2] => 3
    [3] => 18
    [4] => bar
    [5] => betty
    [6] => 1
    [7] => 10
)

Widać wyraźnie, że nie zostały zachowane klucze &#8211; ani numeryczne, ani asocjacyjne. Jest pewien sprytny sposób by obejść ten problem. Zastosować musimy jeszcze jedną funkcję &#8211; <strong>array_keys()</strong>:

<div class='stb-info_box' >array <strong>array_keys</strong> (array $input [, mixed $search_value [, bool $strict = false]])</div>

Funkcja ta najprościej mówiąc zwraca tablicę, której elementami są klucze z przekazanej do niej tablicy <strong>$input</strong>. Jeśli podamy drugi opcjonalny argument <strong>$search_value</strong> tylko klucze odpowiadające jego wartości będą brane pod uwagę. W innym wypadku, wszystkie klucze są zwracane. Możemy podać jeszcze jeden argument, <strong>$strict</strong>, determinujący czy podczas porównywania kluczy z wartością <strong>$search_value</strong> funkcja ma stosować dokładne porównanie operatorem <strong>===</strong>. Domyślnie klucze porównywane są za pomocą <strong>==</strong>.
A oto jak wykorzystamy tą funkcję do naszego pierwotnego celu:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$towns</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'krosno'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'krakow'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'przemysl'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bielsko biala'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'tarnobrzeg'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'foo'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'wroclaw'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$keys</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_keys</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$towns</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">shuffle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$keys</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$keys</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$new_tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$towns</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$new_tab</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Cały &#8222;trick&#8221; polega na tym, że mieszamy nie naszą docelową tablicę (w tym wypadku <strong>$towns</strong>), a tablicę utworzoną z jej kluczy. Następnie za pomocą zwykłego <strong>foreach()</strong> tworzymy nową tablicę <strong>$new_tab</strong> zawierającą odpowiednie powiązania klucz &#8211; wartość, takie jak w pierwotnej tablicy.

Pisząc o tasowaniu elementów, a także wyciąganiu kluczy, trzeba wspomnieć także o jeszcze jednej funkcji, a mianowicie o <strong>array_rand()</strong>. Na pierwszy rzut oka można pomyśleć, że funkcja ta zwraca losowy element z tablicy. Tak jednak nie jest. Funkcja <strong>array_rand()</strong> zwraca losowo klucz, lub kilka kluczy z podanej do niej tablicy.

<div class='stb-info_box' >mixed <strong>array_rand</strong> (array $input [, int $num_req = 1])</div>

Jak wynika z powyższej definicji, domyślnie funkcja zwraca nam jeden losowy klucz. Można to uściślić podając drugi argument <strong>$num_req</strong>.


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$towns</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'krosno'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'krakow'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'przemysl'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bielsko biala'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'tarnobrzeg'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'foo'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'wroclaw'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$new_tab</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_rand</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$towns</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$new_tab</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Wynikiem działania funkcji będzie coś w rodzaju:

<pre>
Array
(
    [0] => 1
    [1] => 2
    [2] => foo
)
</pre>]]></content:encoded>
			<wfw:commentRss>http://tomek.rychtyk.pl/blog/2011/01/03/anty-sort-czyli-robienie-balaganu-w-tablicy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sortowanie tablic</title>
		<link>http://tomek.rychtyk.pl/blog/2011/01/02/sortowanie-tablic/</link>
		<comments>http://tomek.rychtyk.pl/blog/2011/01/02/sortowanie-tablic/#comments</comments>
		<pubDate>Sun, 02 Jan 2011 22:38:08 +0000</pubDate>
		<dc:creator>vonski</dc:creator>
				<category><![CDATA[Notatki do ZCE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tablice]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tablice]]></category>
		<category><![CDATA[zce]]></category>

		<guid isPermaLink="false">http://tomek.rychtyk.pl/blog/?p=407</guid>
		<description><![CDATA[PHP wyposaża nas w sumie w dwanaście funkcji, których zadaniem jest sortowanie tablic na przeróżne sposoby. Funkcje te to: sort(), asort(), rsort(), arsort(), ksort(), krsort(), natsort(), natcasesort(), usort(), uasort(), uksort() oraz array_multisort(). sort() Do zwykłego sortowania używamy funkcji sort(). Jest to najbardziej podstawowa funkcja. Sortuje ona elementy od najmniejszego do największego bez zachowania kluczy. Jako [...]]]></description>
			<content:encoded><![CDATA[<a href="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png"><img src="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png" alt="" title="1289946386_folder_black_PHP" width="128" height="105" class="alignleft size-full wp-image-307" /></a>PHP wyposaża nas w sumie w dwanaście funkcji, których zadaniem jest sortowanie tablic na przeróżne sposoby. Funkcje te to: <strong>sort()</strong>,<strong> asort()</strong>,<strong> rsort()</strong>, <strong>arsort()</strong>, <strong>ksort()</strong>, <strong>krsort()</strong>, <strong>natsort()</strong>, <strong>natcasesort()</strong>, <strong>usort()</strong>, <strong>uasort()</strong>, <strong>uksort()</strong> oraz <strong>array_multisort()</strong>.

<span id="more-407"></span>

<h4>sort()</h4>

Do zwykłego sortowania używamy funkcji <strong>sort()</strong>. Jest to najbardziej podstawowa funkcja. Sortuje ona elementy od najmniejszego do największego bez zachowania kluczy. 

<div class='stb-info_box' >bool <strong>sort</strong> (array &#038;$array [, int $sort_flags = SORT_REGULAR])</div>

Jako drugi, opcjonalny parametr funkcja ta przyjmuje liczbę determinującą sposób sortowania. Domyślnie jest to <strong>SORT_REGULAR</strong>, co oznacza, że podczas sortowania wartości nie są rzutowane. Możemy również przekazać jako drugi parametr <strong>SORT_NUMERIC</strong> &#8211; wówczas wartości będą rzutowane na typ numeryczny, a następnie sortowane. Trzecią opcją jest <strong>SORT_STRING</strong> &#8211; podobnie jak w poprzednim przypadku z tą różnicą, że wartości będą rzutowane do strignów. Istnieje jeszcze czwarta predefiniowana stała, którą możemy tu podać, jest to <strong>SORT_LOCALE_STRING</strong>. Jeśli ją podamy, wartości będą porównywane jak stringi w zależności od bieżącej lokalizacji.
Funkcja ta zwraca <strong>TRUE</strong> w przypadku powodzenia, lub <strong>FALSE</strong> w przeciwnym wypadku.

Warto zauważyć, że tablica do funkcji przekazywana jest przez referencję, dlatego funkcja ta operuje bezpośrednio na tablicy, nie na jej kopii. Druga rzecz to fakt, że <strong>sort()</strong> &#8222;gubi&#8221; klucze jakie znajdowały się w tablicy przed sortowaniem, a posortowanym elementom przypisuje nowe, numeryczne klucze poczynając od zera. Jeśli chcemy uzyskać efekt sortowania podobny do <strong>sort()</strong> z tą różnicą, że klucze mają być zachowane, powinniśmy użyć <strong>asort()</strong>

<h4>asort()</h4>

<div class='stb-info_box' >bool <strong>asort</strong> (array &#038;$array [, int $sort_flags = SORT_REGULAR])</div>

Funkcja ta zachowuje się niemalże identycznie jak <strong>sort()</strong>, z tą tylko różnicą, że zachowuje porządek kluczy z przed sortowania.

<h4>rsort()</h4>

<div class='stb-info_box' >bool <strong>rsort</strong> (array &#038;$array [, int $sort_flags = SORT_REGULAR])</div>

Ponownie kolejna wariacja funkcji <strong>sort()</strong> &#8211; tym razem odmiana, która sortuje elementy w porządku malejącym (od największego do najmniejszego). Ale podobnie jak <strong>sort()</strong> nie zachowuje kluczy.

<h4>arsort()</h4>

<div class='stb-info_box' >bool <strong>rsort</strong> (array &#038;$array [, int $sort_flags = SORT_REGULAR])</div>

Funkcja bardzo podobna do powyższej &#8211; sortuje elementy w porządku malejącym, z tą różnicą, że zachowuje klucze z przed sortowania.

<h4>natsort()</h4>
Podczas gdy wyżej wymienione funkcje sortują tablice poprzez porównywanie wartości numerycznych, lub przeprowadzają porównywanie bajt po bajcie w przypadku stringów, czasem potrzebujemy bardziej &#8222;naturalnego&#8221; rodzaju sortowania. Załóżmy że mamy taką tablicę:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'image1.png'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'image12.png'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'image5.png'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'image10.png'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Używając funkcji <strong>sort()</strong> do jej posortowania dostalibyśmy elementy w następującym porządku:
<strong>image1.png</strong>,<strong> image10.png</strong>,<strong> image12.png</strong>, <strong>image5.png</strong>
Logiczne jest jednak, że chcielibyśmy otrzymać coś takiego:
<strong>image1.png</strong>,<strong> image5.png</strong>, <strong>image10.png</strong>,<strong> image12.png</strong>

Da się to uzyskać dzięki zastosowaniu funkcji<strong> natsort()</strong>:

<div class='stb-info_box' >bool <strong>natsort</strong> (array &#038;$array)</div>

Funkcja ta sortuje tablicę w sposób &#8222;naturalny&#8221; dla człowieka. Dodatkowo należy zapamiętać, że <strong>funkcja <strong>natsort()</strong> zachowuje oryginalne klucze z przed sortowania!</strong>

Istnieje jednak kilka pułapek związanych ze stosowaniem <strong>natsort()</strong>:

<strong>1. Liczby ujemne</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$negative</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'-5'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'3'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'-2'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'0'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'-1000'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'9'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Przed:&lt;br&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$negative</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">natsort</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$negative</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Po:&lt;br&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$negative</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Ten kod wyświetli nam:

<pre>
Przed:
Array
(
    [0] => -5
    [1] => 3
    [2] => -2
    [3] => 0
    [4] => -1000
    [5] => 9
    [6] => 1
)

Po:
Array
(
    [2] => -2
    [0] => -5
    [4] => -1000
    [3] => 0
    [6] => 1
    [1] => 3
    [5] => 9
)
</pre>

<strong>2. Liczby dopełnione zerem</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Dopełnienie zerem<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$zeros</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'09'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'8'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'10'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'009'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'011'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'0'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$zeros</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">natsort</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$zeros</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$zeros</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Kod wyświetli:

<pre>
Dopełnienie zerem
Array
(
    [0] => 09
    [1] => 8
    [2] => 10
    [3] => 009
    [4] => 011
    [5] => 0
)
Array
(
    [5] => 0
    [1] => 8
    [3] => 009
    [0] => 09
    [2] => 10
    [4] => 011
)
</pre>

Jeszcze jedna ważna rzecz &#8211; <strong>natsort()</strong> rozróżnia wielkość liter. Generalnie jeśli mamy np. takie elementy:
&#8216;abc&#8217;, &#8216;def&#8217;, &#8216;Ghi&#8217;, &#8216;jkl&#8217;, &#8216;Mno&#8217;, to wynikiem sortowania będzie:
&#8216;Ghi&#8217;, &#8216;Mno&#8217;, &#8216;abc&#8217;, &#8216;def&#8217;, &#8216;jkl&#8217;

Czyli jak widać, funkcja najpierw bierze wszyskie wyrazy zaczynające się od dużych liter, sortuje je i wrzuca na początek tablicy, a później zajmuje się pozostałymi. Jeżeli chcemy, posortować elementy tablicy za pomocą algorytmu, z którego korzysta <strong>natsort()</strong>, ale przy tym chcemy, aby wielkość liter NIE była rozróżniana, powinniśmy użyć funkcji <strong>natcasesort()</strong>.

<h4>natcasesort()</h4>
<div class='stb-info_box' >bool <strong>natcasesort</strong> (array &#038;$array)</div>

Sortuje tablicę w niemalże identyczny sposób co <strong>natsort()</strong> z tą różnicą, że podczas sortowania NIE jest rozróżniana wielkość liter.

<h4>ksort()</h4>

<div class='stb-info_box' >bool <strong>ksort</strong> (array &#038;$array [, int $sort_flags = SORT_REGULAR])</div>

Funkcja <strong>ksort()</strong> sortuje tablicę w inny sposób niż poprzenio wymienione funkcje. Porównuje ona bowiem klucze, nie wartości. Cała reszta (tzn. działanie opcjonalnego atrybutu <strong>$sort_flags</strong>, sama zasada porównywania kluczy) jest analogiczna do <strong>sort()</strong>, z tą jeszcze różnicą, że zachowane są klucze (co jest w tym przypadku logiczne, bo przecież po nich sortujemy).

<h4>krsort()</h4>

<div class='stb-info_box' >bool <strong>ksort</strong> (array &#038;$array [, int $sort_flags = SORT_REGULAR])</div>

Działa analogicznie do <strong>rsort()</strong> z tym że podobnie jak <strong>ksort()</strong> sortuje tablicę po kluczach, nie po wartościach. Elementy układane są od największego do najmniejszego.

<h4>usort()</h4>

PHP umożliwia nam również sortowanie tablicy za pomocą funkcji zdefiniowanej przez użytkownika. Służy do tego funkcja <strong>usort()</strong>.

<div class='stb-info_box' >bool <strong>usort</strong> (array &#038;$array, callback $cmp_function)</div>

Oto przykład w jaki sposób działa <strong>usort()</strong>:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> myCmp<span style="color: #009900;">&#40;</span><span style="color: #000088;">$left</span><span style="color: #339933;">,</span> <span style="color: #000088;">$right</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$diff</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$left</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$right</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$diff</span><span style="color: #009900;">&#41;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">else</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$diff</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'2baz'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'foo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'betty'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'sally'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'new york'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">usort</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'myCmp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Powyższa funkcja sortuje wyrazy z tablicy <strong>$a</strong> od najkrótszego do najdłuższego. Nasza funkcja <strong>myCmp()</strong> musi zwrócić zero w przypadku gdy oba elementy tablicy mają być traktowane jako równe, wartość mniejszą od zera, jeśli element po lewej jest większy od tego po prawej i wartość większą od zera w przeciwnym wypadku.

Jak widać funkcja <strong>usort()</strong> analogicznie do <strong>sort()</strong> nie zachowuje kluczy z przed sortowania, tylko numeruje tablicę od nowa. Aby temu zapobiec należy użyć funkcji <strong>uasort()</strong>.

<h4>uasort()</h4>

<div class='stb-info_box' >bool <strong>uasort</strong> (array &#038;$array, callback $cmp_function)</div>

Funkcja ta działa analogicznie do <strong>usort()</strong> z tą różnicą, że zachowuje ona klucze obecne w tablicy przed sortowaniem.

<h4>uksort()</h4>

Kolejna funkcja służąca do sortowania w &#8222;niecodzienny&#8221; sposób, która również działa analogicznie do przedstawionej wyżej <strong>usort()</strong>, tyle że ta porównuje ze sobą klucze tablicy, a nie jej wartości i na podstawie tego porównania układa elementy tablicy. Reszta odbywa się tak samo jak w przypadku <strong>usort()</strong>.

<h4>array_multisort()</h4>

Na koniec mamy ciekawą funkcję służącą do sortowania kilku tablic na raz, lub do sortowania tablicy wielowymiarowej po więcej niż jednym wymiarze.

<div class='stb-info_box' >bool <strong>array_multisort</strong> (&#038;$array [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $... ]]])</div>

Sposób sortowania <strong>array_multisort()</strong> można porównać w pewnym sensie do <strong>ORDER BY</strong> z SQL-a. Generalnie funkcja ta jako pierwszy argument przyjmuje tablicę, będąca tablicą nadrzędna &#8211; na jej podstawie będą sortowane także elementy innych tablic, które przekażemy do funkcji. Jeśli elementy tablicy pierwszej są równe, wówczas odpowiadające im elementy w drugiej tablicy będą porównywane. Brzmi to co najmniej zagmatwanie, ale jak zwykle wszystko rozjaśni przykład:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$ar1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ar2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">array_multisort</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ar1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ar2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Po wykonaniu tego kodu, powyższe tablice będą miały następującą strukturę:

<pre>
Array
(
    [0] => 0
    [1] => 10
    [2] => 100
    [3] => 100
)

Array
(
    [0] => 4
    [1] => 1
    [2] => 2
    [3] => 3
)
</pre>

O ile wygląd pierwszej nie jest zaskakujący, o tyle układ elementów drugiej tablicy może na pierwszy rzut oka nieco dziwić. Jest to jednak to, o co nam chodziło. Przyjrzyjmy się uważniej. W pierwszej tablicy ostatni element poszedł na sam początek, ten który był na początku, poszedł na drugie miejsce, a na końcu mamy 100 i 100 &#8211; czyli o to chodziło, tablica jest posortowana. I teraz zauważ, że odpowiadające tym elementom elementy z drugiej tablicy &#8222;powędrowały&#8221; za nimi. Przed sortowaniem &#8222;4&#8243; było na końcu, teraz jest na początku &#8211; czyli tak jak w przypadku pierwszej tablicy &#8211; &#8222;0&#8243; było na końcu, teraz jest na początku. Tak samo ułożyły się pozostałe elementy. Zauważ też, że &#8222;2&#8243; i &#8222;3&#8243; odpowiadające &#8222;100&#8243; też zostały posortowane.

Funkcję <strong>array_multisort()</strong> można również wywołać w &#8222;bardziej skomplikowany&#8221; sposób, tzn. przekazać bardziej szczegółowe wytyczne co do sortowania. Załóżmy, że chcemy powyższe dwie tablice posortować w taki sposób: pierwszą rosnąco, przy czym jej elementy mają być traktowane stricte jak elementy numeryczne, natomiast druga ma być sortowana względem pierwszej malejąco, a jej elementy mają być traktowane jak stringi.


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$ar1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ar2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">array_multisort</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ar1</span><span style="color: #339933;">,</span> SORT_ASC<span style="color: #339933;">,</span> SORT_NUMERIC<span style="color: #339933;">,</span>
		     <span style="color: #000088;">$ar2</span><span style="color: #339933;">,</span> SORT_DESC<span style="color: #339933;">,</span> SORT_STRING<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Po sortowaniu tablice będą miały postać:

<pre>
Array
(
    [0] => 0
    [1] => 10
    [2] => 100
    [3] => 100
)

Array
(
    [0] => 4
    [1] => 1
    [2] => 3
    [3] => 2
)
</pre>

Warto jeszcze zapamiętać, że <strong>array_multisort()</strong> zachowuje klucze asocjacyjne, ale gubi klucze numeryczne.]]></content:encoded>
			<wfw:commentRss>http://tomek.rychtyk.pl/blog/2011/01/02/sortowanie-tablic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zabawy ze wskaźnikiem tablicowym</title>
		<link>http://tomek.rychtyk.pl/blog/2010/12/29/zabawy-ze-wskaznikiem-tablicowym/</link>
		<comments>http://tomek.rychtyk.pl/blog/2010/12/29/zabawy-ze-wskaznikiem-tablicowym/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 23:14:06 +0000</pubDate>
		<dc:creator>vonski</dc:creator>
				<category><![CDATA[Notatki do ZCE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tablice]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tablice]]></category>
		<category><![CDATA[zce]]></category>

		<guid isPermaLink="false">http://tomek.rychtyk.pl/blog/?p=402</guid>
		<description><![CDATA[Każda tablica posiada swój wewnętrzny wskaźnik, który, jak nietrudno się domyślić, wskazuje na &#8222;bieżący&#8221; element będący obiektem aktualnej iteracji. PHP wyposaża programistę w szereg funkcji pozwalających sprawnie operować tymże wskaźnikiem. Są to: reset(), current(), end(), prev(), next(), key() oraz each(). Do tego dochodzi jeszcze specjalny rodzaj pętli, ułatwiający iterowanie po tablicach: foreach(). current() Funkcja ta [...]]]></description>
			<content:encoded><![CDATA[<a href="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png"><img src="http://tomek.rychtyk.pl/blog/wp-content/uploads/2010/11/1289946386_folder_black_PHP.png" alt="" title="1289946386_folder_black_PHP" width="128" height="105" class="alignleft size-full wp-image-307" /></a>Każda tablica posiada swój wewnętrzny wskaźnik, który, jak nietrudno się domyślić, wskazuje na &#8222;bieżący&#8221; element będący obiektem aktualnej iteracji. PHP wyposaża programistę w szereg funkcji pozwalających sprawnie operować tymże wskaźnikiem. Są to: <strong>reset()</strong>, <strong>current()</strong>, <strong>end()</strong>, <strong>prev()</strong>, <strong>next()</strong>, <strong>key()</strong> oraz <strong>each()</strong>. Do tego dochodzi jeszcze specjalny rodzaj pętli, ułatwiający iterowanie po tablicach: <strong>foreach()</strong>.

<span id="more-402"></span>

<h5>current()</h5>

<div class='stb-info_box' >mixed <strong>current</strong> (array &#038;$array)</div>
Funkcja ta zwraca element, na który aktualnie wskazuje wewnętrzny wskaźnik tablicowy. Nie przesuwa wskaźnika w żadnym kierunku. Jeśli wskaźnik znajduje się za ostatnim elementem tablicy, wówczas zostanie zwrócona wartość <strong>FALSE</strong>.

<h5>prev()</h5>

<div class='stb-info_box' >mixed <strong>prev</strong> (array &#038;$array)</div>
Przesuwa wewnętrzny wskaźnik tablicy o jeden element do tyłu, a następnie zwraca wartość elementu. Zwróci <strong>FALSE</strong> jeśli tablica jest pusta, lub jeśli przed przesunięciem wskaźnik znajdował się na pierwszym elemencie tablicy.

<h5>next()</h5>
<div class='stb-info_box' >mixed <strong>next</strong> (array &#038;$array)</div>
Przesuwa wewnętrzny wskaźnik tablicy o jeden element do przodu, a następnie zwraca wartość elementu. Jeśli przed przesunięciem wskaźnik znajdował się na końcu tablicy, poza ostatnim elementem, lub jeśli tablica jest pusta, zostanie zwrócona wartość <strong>FALSE</strong>.

<h5>end()</h5>
<div class='stb-info_box' >mixed <strong>end</strong> (array &#038;$array)</div>
Przesuwa wewnętrzny wskaźnik tablicowy na ostatni element, a następnie zwraca wartość tego elementu. Zwraca <strong>FALSE</strong> w przypadku pustej tablicy.

<h5>reset()</h5>
<div class='stb-info_box' >mixed <strong>reset</strong> (array &#038;$array)</div>
Przesuwa wskaźnik tablicowy na pierwszy element w tablicy i zwraca jego wartość. No i jak zwykle <strong>FALSE</strong> jeśli tablica jest pusta.

<h5>key()</h5>
<div class='stb-info_box' >mixed <strong>key</strong> (array &#038;$array)</div>
Zwraca wartość bieżącego klucza. Jeżeli wskaźnik wewnętrzny pokazuje poza tablicę, lub tablica jest pusta, funkcja zwraca wartość <strong>NULL</strong>

<h5>each()</h5>

<div class='stb-info_box' >array <strong>each</strong> (&#038;$array)</div>
Funkcja ta zwraca parę klucz-wartość elementu, na który aktualnie wskazuje wskaźnik, po czym przesuwa ten wskaźnik o jeden element dalej, lub, jeśli zwrócona została para ostatniego elementu, przesuwa wskaźnik za ostatni element tablicy. Aby przywrócić wskaźnik do pozycji początkowej, należy użyć funckji <strong>reset()</strong>.
Zwracana tablica ma cztery elementy o następujących indeksach: 0, 1, &#8216;key&#8217;, &#8216;value&#8217;, przy czym elementy o indeksach 0 i &#8216;key&#8217; zawierają klucz, a elementy o indeksach 1 i &#8216;value&#8217; zawierają wartość.
Jeżeli wewnętrzny wskaźnik pokazuje za ostatni element tablicy, zwracana jest wartość <strong>NULL</strong>.

<strong>Przykład funkcji wykorzystującej kilka z powyższych:</strong>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'bar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'baz'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bat'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> displayArray<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">reset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">key</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #990000;">key</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;: &quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">current</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br&gt;'</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">next</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>




Na początku wywoływana jest <strong>reset() </strong>aby przewinąć wskaźnik na początek tablicy. Następnie używając pętli <strong>while </strong>wyświetlamy elementy tablicy w formacie &#8222;<strong>klucz: wartość</strong>&#8222;. Zauważ w jaki sposób sprawdzamy czy pętla powinna kontynuować swoje działanie. Konieczne jest absolutne porównanie za pomocą operatora<strong> !==</strong>. Dlaczego? Wyobraź sobie, że jednym z kluczy jest wartość <strong>0</strong>. Porównując w ten sposób:<strong> 0 != null</strong> otrzymamy <strong>false</strong> i pętla się zakończy, czego wcale byśmy nie chcieli. Dlatego należy pamiętać, że przy porównywaniu wartości zwracanych przez <strong>key()</strong> (ale także przez <strong>next()</strong>,<strong> prev()</strong>,<strong> end()</strong> i <strong>current()</strong> ) musimy podwoić naszą czujność!

<h4>Prostszy sposób</h4>

Jak widać wyżej, iterowanie po tablicach za pomocą wymienionych funkcji wymaga trochę pracy. W <strong>PHP </strong>istnieje jednak specjalna pęta przeznaczona specjalnie do pracy z tablicami &#8211; <strong>foreach()</strong>:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'baz'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">': '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$value</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br/&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>




Pętla ta &#8222;przelatuje&#8221; po wszystkich elementach tablicy i wyświetla je w formacie &#8222;<strong>klucz: wartość</strong>&#8222;.
Należy przy tam pamiętać, że <strong>foreach()</strong> pracuje na <em><strong>kopii</strong></em> tablicy, przez co wszelkie zmiany dokonane wewnątrz pętli, nie będą miały wpływu na oryginalną tablicę. Kolejna rzecz to fakt, że <strong>foreach()</strong> zawsze przewija wskaźnik na początek tablicy toteż nie mamy wpływu na to, od którego elementu ma zacząć się iteracja.
W <strong>PHP5 </strong>została wprowadzona możliwość przypisywania wartości tablicy do iterowanej zmiennej przez referencję:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span> <span style="color: #b1b100;">as</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$value</span><span style="color: #339933;">++;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// tablica $array będzie zawierać teraz elementy: 2,3,4</span></pre></div></div>




Technika ta jest przydatna w wielu sytuacjach, jednak należy uważać na pewną pułapkę związaną z naturą przypisywania do zmiennych przez referencję. Spójrz na poniższy kod:


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span> <span style="color: #b1b100;">as</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$v</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$v</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>




Jak myślisz, co będzie teraz zawierać tablica <strong>$array</strong>? Wydawało by się, że powinna nadal zwierać elementy: <strong>1</strong>, <strong>2</strong> i <strong>3</strong>, bo przecież tak naprawdę &#8216;przelecieliśmy&#8217; ją tylko dwa razy pętlą <strong>foreach() </strong>ale niczego nie zmienialiśmy. Rzeczywistość jest jednak brutalna i po wywołaniu <strong>print_r($array) </strong>ujrzymy:

<code>
Array
(
    [0] => 1
    [1] => 2
    [2] => 2
)
</code>

Spójrzmy dlaczego tak jest. Pierwszy<strong> foreach()</strong> faktycznie nic nie zmienia w naszej tablicy, jedynie przypisuje przez referencję po kolei każdą jej wartość do zmiennej <strong>$v</strong>. I teraz uwaga. Po zakończeniu działania pierwszej pętli, do zmiennej <strong>$v</strong> przypisany jest przez referencję ostatni element tablicy, czyli <strong>$array[2]</strong>. Jeżeli wiemy jak działają referencje, już powinniśmy wiedzieć skąd wzięła się ostateczna postać tablicy <strong>$array</strong>. Podczas drugiej iteracji do zmiennej <strong>$v</strong> ponownie przypisywane są kolejno wartości tablicy<strong> $array</strong>. Tylko że <strong>$v</strong> jest już referencją do <strong>$array[2] </strong>dlatego wszystko to, co przypiszemy do <strong>$v</strong>, przypisujemy też do ostatniego elementu tablicy. Tak wiec po pierwszej iteracji <strong>$array[2] </strong>jest równe 1, po drugiej <strong>$array[2] </strong>równa się <strong>2</strong>, natomiast po trzeciej jest nadpisywany samym sobą więc również równa się 2. Mając to na uwadze, powinniśmy zawsze zwalniać zmienne za pomocą <strong>unset()</strong> jeśli wcześniej były one referencją.]]></content:encoded>
			<wfw:commentRss>http://tomek.rychtyk.pl/blog/2010/12/29/zabawy-ze-wskaznikiem-tablicowym/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

