Відмінності між версіями «Робота з асоціативними масивами в PHP»

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук
Рядок 119: Рядок 119:
 
<p style="color: rgb(0, 51, 153);"><strong>Сортировка массивов</strong></p>
 
<p style="color: rgb(0, 51, 153);"><strong>Сортировка массивов</strong></p>
 
<p>Начнем с самого простого — сортировки массивов. В <strong>PHP</strong> для этого существует очень много функций. С их помощью можно сортировать ассоциативные массивы и списки в порядке возрастания или убывания, а также в том порядке, в каком вам необходимо — посредством пользовательской функции сортировки.</p>
 
<p>Начнем с самого простого — сортировки массивов. В <strong>PHP</strong> для этого существует очень много функций. С их помощью можно сортировать ассоциативные массивы и списки в порядке возрастания или убывания, а также в том порядке, в каком вам необходимо — посредством пользовательской функции сортировки.</p>
<p class="mtx1" style="color: green;"><strong>Сортировка массива по значениям c помощью функций asort() и arsort():</strong></p>
+
<p style="color: green;"><strong>Сортировка массива по значениям c помощью функций asort() и arsort():</strong></p>
<p><a name="asort"></a>Функция <a href="/functions/?asort" target="_blank"><strong>asort()</strong></a> сортирует массив, указанный в ее параметре, так, чтобы его значения шли в алфавитном (если это строки) или в возрастающем (для чисел) порядке.<br>
+
<p>Функция <strong>asort()</strong> сортирует массив, указанный в ее параметре, так, чтобы его значения шли в алфавитном (если это строки) или в возрастающем (для чисел) порядке.<br>
  
 
   При этом сохраняются связи между ключами и соответствующими им значениями, т. е. некоторые пары ключ=&gt;значение просто "всплывают" наверх, а некоторые — наоборот, "опускаются". Например:</p>
 
   При этом сохраняются связи между ключами и соответствующими им значениями, т. е. некоторые пары ключ=&gt;значение просто "всплывают" наверх, а некоторые — наоборот, "опускаются". Например:</p>
<p class="highlight"><code>$A=array("a"=&gt;"Zero","b"=&gt;"Weapon","c"=&gt;"Alpha","d"=&gt;"Processor");<br>
+
<code>$A=array("a"=&gt;"Zero","b"=&gt;"Weapon","c"=&gt;"Alpha","d"=&gt;"Processor");<br>
 
   asort($A);<br>
 
   asort($A);<br>
 
   foreach($A as $k=&gt;$v) echo "$k=&gt;$v ";<br>
 
   foreach($A as $k=&gt;$v) echo "$k=&gt;$v ";<br>
 
 
   // выводит "c=&gt;Alpha d=&gt;Processor b=&gt;Weapon a=&gt;Zero"<br>
 
   // выводит "c=&gt;Alpha d=&gt;Processor b=&gt;Weapon a=&gt;Zero"<br>
// как видим, поменялся только порядок пар ключ=&gt;значение</code></p>
+
// как видим, поменялся только порядок пар ключ=&gt;значение</code>
<p><a name="arsort"></a>Функция <strong><a href="/functions/?arsort" target="_blank">arsort()</a></strong> выполняет то же самое, за одним исключением: она упорядочивает массив не по возрастанию, а по убыванию.</p>
+
<p>Функция <strong>arsort()</strong> выполняет то же самое, за одним исключением: она упорядочивает массив не по возрастанию, а по убыванию.</p>
<p class="mtx1" style="color: green;"><strong>Сортировка по ключам с помощью функций ksort() и krsort():</strong></p>
+
<p style="color: green;"><strong>Сортировка по ключам с помощью функций ksort() и krsort():</strong></p>
  
<p>Функция <strong><a href="/functions/?ksort" target="_blank">ksort()</a></strong> практически идентична функции <strong><a href="#asort">asort()</a></strong>, с тем различием, что сортировка осуществляется не по значениями, а по ключам (в порядке возрастания).<br>
+
<p>Функция <strong>ksort()</strong> практически идентична функции <strong>asort()</strong>, с тем различием, что сортировка осуществляется не по значениями, а по ключам (в порядке возрастания).<br>
 
Например:</p>
 
Например:</p>
<p class="highlight"><code>$A=array("d"=&gt;"Zero", "c"=&gt;"Weapon", "b"=&gt;"Alpha", "a"=&gt;"Processor");<br>
+
<code>$A=array("d"=&gt;"Zero", "c"=&gt;"Weapon", "b"=&gt;"Alpha", "a"=&gt;"Processor");<br> ksort($A);<br>
  ksort($A);<br>
+
 
+
 
   for(Reset($A); list($k,$v)=each($A);) echo "$k=&gt;$v ";<br>
 
   for(Reset($A); list($k,$v)=each($A);) echo "$k=&gt;$v ";<br>
// выводит "a=&gt;Processor b=&gt;Alpha c=&gt;Weapon d=&gt;Zero"</code></p>
+
// выводит "a=&gt;Processor b=&gt;Alpha c=&gt;Weapon d=&gt;Zero"</code>
<p>Функция для сортировки по ключам в обратном порядке называется <strong><a href="/functions/?krsort" target="_blank">krsort()</a></strong> и применяется точно в таком же контексте, что и <strong>ksort()</strong>.</p>
+
<p>Функция для сортировки по ключам в обратном порядке называется <strong>krsort()</strong> и применяется точно в таком же контексте, что и <strong>ksort()</strong>.</p>
 +
<p style="color: green;"><strong>Сортировка по ключам при помощи функции uksort():</strong></p>
 +
<p>Довольно часто нам приходится сортировать что-то по более сложному критерию, чем просто по алфавиту. Например, пусть в <strong>$Files</strong> хранится список имен файлов и подкаталогов в текущем каталоге. Возможно, мы захотим вывести этот список не только в лексикографическом порядке, но также и чтобы все каталоги предшествовали файлам. В этом случае нам стоит воспользоваться функцией <strong>uksort()</strong>, написав предварительно функцию сравнения с двумя параметрами, как того требует <strong>uksort()</strong>.</p>
 +
<code><font color="#000000"><font color="#008000">&lt;?</font><font color="#0000bb">php</font><br>
 +
<font color="#ff8000">//&nbsp;Эта&nbsp;функция&nbsp;должна&nbsp;сравнивать&nbsp;значения&nbsp;$f1&nbsp;и&nbsp;$f2&nbsp;и nbsp;возвращать:</font><br>
 +
<font color="#ff8000">//&nbsp;-1,&nbsp;если&nbsp;$f1&lt;$f2,</font><br>
 +
<font color="#ff8000">//&nbsp;0,&nbsp;если&nbsp;$f1==$f2</font><br>
 +
<font color="#ff8000">//&nbsp;1,&nbsp;если&nbsp;$f1&gt;$f2</font><br>
 +
<font color="#ff8000">//&nbsp;Под&nbsp;&lt;&nbsp;и&nbsp;&gt;&nbsp;понимается&nbsp;следование&nbsp;этих&nbsp;имен&nbsp;в&nbsp;выводимом&nbsp;списке</font><br>
 +
<font color="#008000">function</font><font color="#0000bb">&nbsp;FCmp</font><font color="#008000">($</font><font color="#0000bb">f1</font><font color="#008000">,$</font><font color="#0000bb">f2</font><font color="#008000">)</font><br>
 +
<font color="#008000">{</font><font color="#0000bb">&nbsp;</font><font color="#ff8000">//&nbsp;Каталог&nbsp;всегда&nbsp;предшествует&nbsp;файлу</font><br>
 +
<font color="#008000">if(</font><font color="#0000bb">is_dir</font><font color="#008000">($</font><font color="#0000bb">f1</font><font color="#008000">)</font><font color="#0000bb">&nbsp;</font><font color="#008000">&amp;&amp;</font><font color="#0000bb">&nbsp;</font><font color="#008000">!</font><font color="#0000bb">is_dir</font><font color="#008000">($</font><font color="#0000bb">f2</font><font color="#008000">))</font><font color="#0000bb">&nbsp;</font><font color="#008000">return</font><font color="#0000bb">&nbsp;</font><font color="#008000">-</font><font color="#0000ff">1</font><font color="#008000">;</font><br>
 +
<font color="#ff8000">//&nbsp;Файл&nbsp;всегда&nbsp;идет&nbsp;после&nbsp;каталога</font><br>
 +
<font color="#008000">if(!</font><font color="#0000bb">is_dir</font><font color="#008000">($</font><font color="#0000bb">f1</font><font color="#008000">)</font><font color="#0000bb">&nbsp;</font><font color="#008000">&amp;&amp;</font><font color="#0000bb">&nbsp;is_dir</font><font color="#008000">($</font><font color="#0000bb">f2</font><font color="#008000">))</font><font color="#0000bb">&nbsp;</font><font color="#008000">return</font><font color="#0000bb">&nbsp;</font><font color="#0000ff">1</font><font color="#008000">;</font><br>
 +
<font color="#ff8000">//&nbsp;Иначе&nbsp;сравниваем&nbsp;лексикографически</font><br>
 +
<font color="#008000">if($</font><font color="#0000bb">f1</font><font color="#008000">&lt;$</font><font color="#0000bb">f2</font><font color="#008000">)</font><font color="#0000bb">&nbsp;</font><font color="#008000">return</font><font color="#0000bb">&nbsp;</font><font color="#008000">-</font><font color="#0000ff">1</font><font color="#008000">;</font><font color="#0000bb">&nbsp;</font><font color="#008000">elseif($</font><font color="#0000bb">f1</font><font color="#008000">&gt;$</font><font color="#0000bb">f2</font><font color="#008000">)</font><font color="#0000bb">&nbsp;</font><font color="#008000">return</font><font color="#0000bb">&nbsp;</font><font color="#0000ff">1</font><font color="#008000">;</font><font color="#0000bb">&nbsp;</font><font color="#008000">else</font><font color="#0000bb">&nbsp;</font><font color="#008000">return</font><font color="#0000bb">&nbsp;</font><font color="#0000ff">0</font><font color="#008000">;</font><br>
 +
<font color="#008000">}</font><br>
 +
<font color="#ff8000">//&nbsp;Пусть&nbsp;$Files&nbsp;содержит&nbsp;массив&nbsp;с&nbsp;ключами&nbsp;—&nbsp;именами&nbsp;файлов</font><br>
 +
<font color="#ff8000">//&nbsp;в&nbsp;текущем&nbsp;каталоге.&nbsp;Отсортируем&nbsp;его.</font><br>
 +
<font color="#0000bb">uksort</font><font color="#008000">($</font><font color="#0000bb">Files</font><font color="#008000">,  </font><font color="#ff0000">"FCmp"</font><font color="#008000">);</font><font color="#0000bb">&nbsp;</font><font color="#ff8000">//&nbsp;передаем&nbsp;функцию&nbsp;сортировки&nbsp;"по&nbsp;ссылке"</font><br>
 +
<font color="#008000">?&gt;</font></font></code>
  
<p class="mtx1" style="color: green;"><strong><a name="uksort"></a>Сортировка по ключам при помощи функции uksort():</strong></p>
 
<p>Довольно часто нам приходится сортировать что-то по более сложному критерию, чем просто по алфавиту. Например, пусть в <strong>$Files</strong> хранится список имен файлов и подкаталогов в текущем каталоге. Возможно, мы захотим вывести этот список не только в лексикографическом порядке, но также и чтобы все каталоги предшествовали файлам. В этом случае нам стоит воспользоваться функцией <strong><a href="/functions/?uksort" target="_blank">uksort()</a></strong>, написав предварительно функцию сравнения с двумя параметрами, как того требует <strong>uksort()</strong>.</p>
 
<p class="highlight"><code><font color="#000000"><font color="#008000">&lt;?</font><font color="#0000bb">php</font><br>
 
<font color="#ff8000">//&nbsp;Эта&nbsp;функция&nbsp;должна&nbsp;сравнивать&nbsp;значения&nbsp;$f1&nbsp;и&nbsp;$f2&nbsp;и&nbsp;возвращать:</font><br>
 
 
<font color="#ff8000">//&nbsp;-1,&nbsp;если&nbsp;$f1&lt;$f2,</font><br>
 
<font color="#ff8000">//&nbsp;0,&nbsp;если&nbsp;$f1==$f2</font><br>
 
<font color="#ff8000">//&nbsp;1,&nbsp;если&nbsp;$f1&gt;$f2</font><br>
 
 
<font color="#ff8000">//&nbsp;Под&nbsp;&lt;&nbsp;и&nbsp;&gt;&nbsp;понимается&nbsp;следование&nbsp;этих&nbsp;имен&nbsp;в&nbsp;выводимом&nbsp;списке</font><br>
 
<font color="#008000">function</font><font color="#0000bb">&nbsp;FCmp</font><font color="#008000">($</font><font color="#0000bb">f1</font><font color="#008000">,$</font><font color="#0000bb">f2</font><font color="#008000">)</font><br>
 
 
<font color="#008000">{</font><font color="#0000bb">&nbsp;</font><font color="#ff8000">//&nbsp;Каталог&nbsp;всегда&nbsp;предшествует&nbsp;файлу</font><br>
 
<font color="#008000">if(</font><font color="#0000bb">is_dir</font><font color="#008000">($</font><font color="#0000bb">f1</font><font color="#008000">)</font><font color="#0000bb">&nbsp;</font><font color="#008000">&amp;&amp;</font><font color="#0000bb">&nbsp;</font><font color="#008000">!</font><font color="#0000bb">is_dir</font><font color="#008000">($</font><font color="#0000bb">f2</font><font color="#008000">))</font><font color="#0000bb">&nbsp;</font><font color="#008000">return</font><font color="#0000bb">&nbsp;</font><font color="#008000">-</font><font color="#0000ff">1</font><font color="#008000">;</font><br>
 
 
<font color="#ff8000">//&nbsp;Файл&nbsp;всегда&nbsp;идет&nbsp;после&nbsp;каталога</font><br>
 
<font color="#008000">if(!</font><font color="#0000bb">is_dir</font><font color="#008000">($</font><font color="#0000bb">f1</font><font color="#008000">)</font><font color="#0000bb">&nbsp;</font><font color="#008000">&amp;&amp;</font><font color="#0000bb">&nbsp;is_dir</font><font color="#008000">($</font><font color="#0000bb">f2</font><font color="#008000">))</font><font color="#0000bb">&nbsp;</font><font color="#008000">return</font><font color="#0000bb">&nbsp;</font><font color="#0000ff">1</font><font color="#008000">;</font><br>
 
 
<font color="#ff8000">//&nbsp;Иначе&nbsp;сравниваем&nbsp;лексикографически</font><br>
 
<font color="#008000">if($</font><font color="#0000bb">f1</font><font color="#008000">&lt;$</font><font color="#0000bb">f2</font><font color="#008000">)</font><font color="#0000bb">&nbsp;</font><font color="#008000">return</font><font color="#0000bb">&nbsp;</font><font color="#008000">-</font><font color="#0000ff">1</font><font color="#008000">;</font><font color="#0000bb">&nbsp;</font><font color="#008000">elseif($</font><font color="#0000bb">f1</font><font color="#008000">&gt;$</font><font color="#0000bb">f2</font><font color="#008000">)</font><font color="#0000bb">&nbsp;</font><font color="#008000">return</font><font color="#0000bb">&nbsp;</font><font color="#0000ff">1</font><font color="#008000">;</font><font color="#0000bb">&nbsp;</font><font color="#008000">else</font><font color="#0000bb">&nbsp;</font><font color="#008000">return</font><font color="#0000bb">&nbsp;</font><font color="#0000ff">0</font><font color="#008000">;</font><br>
 
 
<font color="#008000">}</font><br>
 
<font color="#ff8000">//&nbsp;Пусть&nbsp;$Files&nbsp;содержит&nbsp;массив&nbsp;с&nbsp;ключами&nbsp;—&nbsp;именами&nbsp;файлов</font><br>
 
<font color="#ff8000">//&nbsp;в&nbsp;текущем&nbsp;каталоге.&nbsp;Отсортируем&nbsp;его.</font><br>
 
 
<font color="#0000bb">uksort</font><font color="#008000">($</font><font color="#0000bb">Files</font><font color="#008000">,</font><font color="#ff0000">"FCmp"</font><font color="#008000">);</font><font color="#0000bb">&nbsp;</font><font color="#ff8000">//&nbsp;передаем&nbsp;функцию&nbsp;сортировки&nbsp;"по&nbsp;ссылке"</font><br>
 
<font color="#008000">?&gt;</font></font></code></p>
 
 
<p>Конечно, связи между ключами и значениями функцией <strong>uksort()</strong> сохраняются, т. е., опять же, некоторые пары просто "всплывают" наверх, а другие — "оседают".</p>
 
<p>Конечно, связи между ключами и значениями функцией <strong>uksort()</strong> сохраняются, т. е., опять же, некоторые пары просто "всплывают" наверх, а другие — "оседают".</p>
  
<p class="mtx1" style="color: green;"><strong>Сортировка по значениям при помощи функции uasort()</strong></p>
+
<p style="color: green;"><strong>Сортировка по значениям при помощи функции uasort()</strong></p>
<p>Функция <strong><a href="/functions/?uasort" target="_blank">uasort()</a></strong> очень похожа на <a href="#uksort"><strong>uksort()</strong></a>, с той разницей, что сменной (пользовательской) функции сортировки "подсовываются" не ключи, а очередные значения из массива. При этом также сохраняются связи в парах ключ=&gt;значение.</p>
+
<p>Функция <strong>uasort()</strong> очень похожа на <strong>uksort()</strong>, с той разницей, что сменной (пользовательской) функции сортировки "подсовываются" не ключи, а очередные значения из массива. При этом также сохраняются связи в парах ключ=&gt;значение.</p>
<p class="mtx1" style="color: green;"><strong>Переворачивание массива с помощью функции array_reverce()</strong></p>
+
<p style="color: green;"><strong>Переворачивание массива с помощью функции array_reverce()</strong></p>
<p>Функция <a href="/functions/?array_reverse" target="_blank"><strong>array_reverse()</strong></a> возвращает массив, элементы которого следуют в обратном порядке относительно массива, переданного в параметре. При этом связи между ключами и значениями, конечно, не теряются. Например, вместо того, чтобы ранжировать массив в обратном порядке при помощи <strong><a href="#arsort">arsort()</a></strong>, мы можем отсортировать его в прямом порядке, а затем перевернуть:</p>
+
<p>Функция <strong>array_reverse()</strong> возвращает массив, элементы которого следуют в обратном порядке относительно массива, переданного в параметре. При этом связи между ключами и значениями, конечно, не теряются. Например, вместо того, чтобы ранжировать массив в обратном порядке при помощи <strong>arsort()</strong>, мы можем отсортировать его в прямом порядке, а затем перевернуть:</p>
  
<p class="highlight"><code>$A=array("a"=&gt;"Zero","b"=&gt;"Weapon","c"=&gt;"Alpha","d"=&gt;"Processor");<br>
+
<code>$A=array("a"=&gt;"Zero","b"=&gt;"Weapon","c"=&gt;"Alpha","d"=&gt;"Processor");<br>
 
   asort($A);<br>
 
   asort($A);<br>
$A=array_reverse($A);</code></p>
+
$A=array_reverse($A);</code>
 
<p>Конечно, указанная последовательность работает дольше, чем один-единственный вызов <strong>arsort()</strong>.</p>
 
<p>Конечно, указанная последовательность работает дольше, чем один-единственный вызов <strong>arsort()</strong>.</p>
<p class="mtx1" style="color: green;"><strong>Сортировка списка при помощи функций sort() и rsort()</strong></p>
+
<p style="color: green;"><strong>Сортировка списка при помощи функций sort() и rsort()</strong></p>
  
 
<p>Эти две функции предназначены в первую очередь для сортировки списков. </p>
 
<p>Эти две функции предназначены в первую очередь для сортировки списков. </p>
<p>Функция <a href="/functions/?sort" target="_blank"><strong>sort()</strong></a> сортирует список (разумеется, по значениям) в порядке возрастания, а <a href="/functions/?rsort" target="_blank"><strong>rsort()</strong></a> — в порядке убывания. Пример для функции <strong>sort()</strong>:</p>
+
<p>Функция <strong>sort()</strong> сортирует список (разумеется, по значениям) в порядке возрастания, а <strong>rsort()</strong> — в порядке убывания. Пример для функции <strong>sort()</strong>:</p>
<p class="highlight"><code><font color="#000000"><font color="#008000">&lt;?</font><font color="#0000bb">php</font><br>
+
<code><font color="#000000"><font color="#008000">&lt;?</font><font color="#0000bb">php</font><br>
        <font color="#008000">$</font><font color="#0000bb">A</font><font color="#008000">=</font><font color="#0000bb">array</font><font color="#008000">(</font><font color="#ff0000">"40"</font><font color="#008000">,</font><font color="#0000bb">&nbsp;</font><font color="#ff0000">"20"</font><font color="#008000">,</font><font color="#0000bb">&nbsp;</font><font color="#ff0000">"10"</font><font color="#008000">,</font><font color="#0000bb">&nbsp;</font><font color="#ff0000">"30"</font><font color="#008000">);</font><br>
+
<font color="#008000">$</font><font color="#0000bb">A</font><font color="#008000">=</font><font color="#0000bb">array</font><font color="#008000">(</font><font color="#ff0000">"40"</font><font color="#008000">,</font><font color="#0000bb">&nbsp;</font><font color="#ff0000">"20"</font><font color="#008000">,</font><font color="#0000bb">&nbsp;</font><font color="#ff0000">"10"</font><font color="#008000">,</font><font color="#0000bb">&nbsp;</font><font color="#ff0000">"30"</font><font color="#008000">);</font><br>
 
+
<font color="#0000bb">sort</font><font color="#008000">($</font><font color="#0000bb">A</font><font color="#008000">);</font><br>
        <font color="#0000bb">sort</font><font color="#008000">($</font><font color="#0000bb">A</font><font color="#008000">);</font><br>
+
<font color="#008000">for($</font><font color="#0000bb">i</font><font color="#008000">=</font><font color="#0000ff">0</font><font color="#008000">;</font><font color="#0000bb">&nbsp;</font><font color="#008000">$</font><font color="#0000bb">i</font><font color="#008000">&lt;</font><font color="#0000bb">count</font><font color="#008000">($</font><font color="#0000bb">A</font><font color="#008000">);</font><font color="#0000bb">&nbsp;</font><font color="#008000">$</font><font color="#0000bb">i</font><font color="#008000">++)</font><font color="#0000bb">&nbsp;echo&nbsp;</font><font color="#ff0000">"$A[$i]"</font><font color="#008000">.</font><font color="#ff0000">"&lt;br&gt;"</font><font color="#008000">;</font><br>
        <font color="#008000">for($</font><font color="#0000bb">i</font><font color="#008000">=</font><font color="#0000ff">0</font><font color="#008000">;</font><font color="#0000bb">&nbsp;</font><font color="#008000">$</font><font color="#0000bb">i</font><font color="#008000">&lt;</font><font color="#0000bb">count</font><font color="#008000">($</font><font color="#0000bb">A</font><font color="#008000">);</font><font color="#0000bb">&nbsp;</font><font color="#008000">$</font><font color="#0000bb">i</font><font color="#008000">++)</font><font color="#0000bb">&nbsp;echo&nbsp;</font><font color="#ff0000">"$A[$i]"</font><font color="#008000">.</font><font color="#ff0000">"&lt;br&gt;"</font><font color="#008000">;</font><br>
+
<font color="#ff8000">//&nbsp;выводит&nbsp;10&nbsp;20&nbsp;30&nbsp;40</font><br>
 
+
<font color="#008000">?&gt;</font></font></code>
        <font color="#ff8000">//&nbsp;выводит&nbsp;10&nbsp;20&nbsp;30&nbsp;40</font><br>
+
<p style="color: green;"><strong>Перемешивание списка с помощью функции shuffle()</strong></p>
        <font color="#008000">?&gt;</font></font></code></p>
+
<p>Функция <strong>shuffle()</strong> "перемешивает" список, переданный ей первым параметром, так, чтобы его значения распределялись случайным образом. Обратите внимание, что, во-первых, изменяется сам массив, а во вторых, ассоциативные массивы восприимаются как списки. Пример:</p>
<p class="mtx1" style="color: green;"><strong>Перемешивание списка с помощью функции shuffle()</strong></p>
+
<p>Функция <a href="/functions/?shuffle" target="_blank"><strong>shuffle()</strong></a> "перемешивает" список, переданный ей первым параметром, так, чтобы его значения распределялись случайным образом. Обратите внимание, что, во-первых, изменяется сам массив, а во вторых, ассоциативные массивы восприимаются как списки. Пример:</p>
+
  
<p class="highlight"><code>$A=array(10,20,30,40,50);<br>
+
<code>$A=array(10,20,30,40,50);<br>
 
   shuffle($A);<br>
 
   shuffle($A);<br>
foreach($A as $v) echo "$v ";</code></p>
+
foreach($A as $v) echo "$v ";</code>
 
<p>Приведенный фрагмент кода выводит числа <strong>10, 20, 30, 40 и 50</strong> в случайном порядке.</p>
 
<p>Приведенный фрагмент кода выводит числа <strong>10, 20, 30, 40 и 50</strong> в случайном порядке.</p>
 
<p>Выполнив этот фрагмент несколько раз, вы можете обнаружить, что от запуска к запуску очередность следования чисел не изменяется. Это свойство обусловлено тем, что функция <strong>shuffle()</strong> использует стандартный генератор случайных чисел, который перед работой необходимо инициализировать при<br>
 
<p>Выполнив этот фрагмент несколько раз, вы можете обнаружить, что от запуска к запуску очередность следования чисел не изменяется. Это свойство обусловлено тем, что функция <strong>shuffle()</strong> использует стандартный генератор случайных чисел, который перед работой необходимо инициализировать при<br>
  
помощи вызова <a href="/functions/?srand" target="_blank"><strong>srand()</strong></a>.</p>
+
помощи вызова <strong>srand()</strong>.</p>
 
<p style="color: rgb(0, 51, 153);"><strong>Операции с ключами и значениями массива</strong></p>
 
<p style="color: rgb(0, 51, 153);"><strong>Операции с ключами и значениями массива</strong></p>
 
<p><strong>array_flip(array $arr)</strong></p>
 
<p><strong>array_flip(array $arr)</strong></p>
<p>Функция <strong><a href="/functions/?array_flip" target="_blank">array_flip()</a></strong> "пробегает" по массиву и меняет местами его ключи и значения. Исходный массив <strong>$arr</strong> не изменяется, а результирующий массив просто возвращается.<br>
+
<p>Функция <strong>array_flip()</strong> "пробегает" по массиву и меняет местами его ключи и значения. Исходный массив <strong>$arr</strong> не изменяется, а результирующий массив просто возвращается.<br>
 
   Конечно, если в массиве присутствовали несколько элементов с одинаковыми значениями, учитываться будет только последний из них:</p>
 
   Конечно, если в массиве присутствовали несколько элементов с одинаковыми значениями, учитываться будет только последний из них:</p>
  
<p class="highlight"><code>$A=array("a"=&gt;"aaa", "b"=&gt;"aaa", "c"=&gt;"ccc");<br>
+
<code>$A=array("a"=&gt;"aaa", "b"=&gt;"aaa", "c"=&gt;"ccc");<br>
 
   $A=array_flip($A);<br>
 
   $A=array_flip($A);<br>
// теперь $A===array("aaa"=&gt;"b", "ccc"=&gt;"c");</code></p>
+
// теперь $A===array("aaa"=&gt;"b", "ccc"=&gt;"c");</code>
<p class="mtx1" style="color: green;"><strong>array_keys(array $arr [,mixed $SearchVal])</strong></p>
+
<p style="color: green;"><strong>array_keys(array $arr [,mixed $SearchVal])</strong></p>
<p>Функция <a href="/functions/?array_keys" target="_blank"><strong>array_keys()</strong></a> возвращает список, содержащий все ключи массива <strong>$arr</strong>. Если задан необязательный параметр <strong>$SearchVal</strong>, то она вернет только те ключи, которым соответствуют значения <strong>$SearchVal</strong>.</p>
+
<p>Функция <strong>array_keys()</strong> возвращает список, содержащий все ключи массива <strong>$arr</strong>. Если задан необязательный параметр <strong>$SearchVal</strong>, то она вернет только те ключи, которым соответствуют значения <strong>$SearchVal</strong>.</p>
  
 
<p>Фактически, эта функция с заданным вторым параметром является обратной по отношению к оператору <strong>[]</strong> — извлечению значения по его ключу.</p>
 
<p>Фактически, эта функция с заданным вторым параметром является обратной по отношению к оператору <strong>[]</strong> — извлечению значения по его ключу.</p>
<p class="mtx1" style="color: green;"><strong>array_values(array $arr)</strong></p>
+
<p style="color: green;"><strong>array_values(array $arr)</strong></p>
<p>Функция <strong><a href="/functions/?array_values" target="_blank">array_values()</a></strong> возвращает список всех значений в ассоциативном массиве <strong>$arr</strong>. Очевидно, такое действие бесполезно для списков, но иногда оправдано для хэшей.</p>
+
<p>Функция <strong>array_values()</strong> возвращает список всех значений в ассоциативном массиве <strong>$arr</strong>. Очевидно, такое действие бесполезно для списков, но иногда оправдано для хэшей.</p>
<p class="mtx1" style="color: green;"><strong>in_array(mixed $val, array $arr)</strong></p>
+
<p style="color: green;"><strong>in_array(mixed $val, array $arr)</strong></p>
<p>Функция <a href="/functions/?in_array" target="_blank"><strong>in_array()</strong></a> возвращает <strong>true</strong>, если элемент со значением <strong>$val</strong> присутствует в массиве <strong>$arr</strong>.<br>
+
<p>Функция <strong>in_array()</strong> возвращает <strong>true</strong>, если элемент со значением <strong>$val</strong> присутствует в массиве <strong>$arr</strong>.<br>
  
 
   Впрочем, если вам часто приходится проделывать эту операцию, подумайте: не лучше ли будет воспользоваться ассоциативным массивом и хранить данные в его ключах, а не в значениях? На этом вы можете сильно выиграть в быстродействии.</p>
 
   Впрочем, если вам часто приходится проделывать эту операцию, подумайте: не лучше ли будет воспользоваться ассоциативным массивом и хранить данные в его ключах, а не в значениях? На этом вы можете сильно выиграть в быстродействии.</p>
<p class="mtx1" style="color: green;"><strong>array_count_values(list $List)</strong></p>
+
<p style="color: green;"><strong>array_count_values(list $List)</strong></p>
<p>Функция <strong><a href="/functions/?array_count_values" target="_blank">array_count_values()</a> </strong>подсчитывает, сколько раз каждое значение встречается в списке <strong>$List</strong>, и возвращает ассоциативный массив с ключами — элементами списка и значениями — количеством повторов этих элементов. Иными словами, функция <strong>array_count_values()</strong> подсчитывает частоту появления значений в списке <strong>$List</strong>. Пример:</p>
+
<p>Функция <strong>array_count_values() </strong>подсчитывает, сколько раз каждое значение встречается в списке <strong>$List</strong>, и возвращает ассоциативный массив с ключами — элементами списка и значениями — количеством повторов этих элементов. Иными словами, функция <strong>array_count_values()</strong> подсчитывает частоту появления значений в списке <strong>$List</strong>. Пример:</p>
  
 
  <code>$List=array(1, "hello", 1, "world", "hello");<br>
 
  <code>$List=array(1, "hello", 1, "world", "hello");<br>
 
   array_count_values($array);<br>// возвращает array(1=&gt;2, "hello"=&gt;2, "world"=&gt;1)</code>
 
   array_count_values($array);<br>// возвращает array(1=&gt;2, "hello"=&gt;2, "world"=&gt;1)</code>

Версія за 11:07, 16 квітня 2010

Асоціативні масиви в PHP

В У PHP індексом масиву може бути не тільки число, а й рядок. Причому на такий рядок не накладаються ніякі обмежень: він може містити пробіли, довжина такого рядка може бути будь-яка.

Асоціативні масиви особливо зручні в ситуаціях, коли елементи масиву зручніше пов'язувати зі словами, а не з числами.

Отже, масиви, індексами яких є рядки, називаються асоціативними масивами.</ins>.

Одновимірні асоціативні масиви::

Одновимірні асоціативні масиви містять тільки один ключ (елемент), відповідний конкретному індексу асоціативного масиву. Наведемо приклад:

<?php
// Ассоциативный массив
$names["Иванов"]="Иван";
$names["Сидоров"]="Николай";
$names["Петров"]="Петр";
// В данном примере: фамилии - ключи ассоциативного массива
// , а имена - элементы массива names
?>

Доступ до елементів одновимірних асоціативних масивів здійснюється так само, як і до елементів звичайних масивів, і має назвудоступом по ключу:

echo $names["Иванов"];

Багатовимірні асоціативні масиви:

Багатовимірні асоціативні масиви можуть містити кілька ключів, відповідних конкретному індексу асоціативного масиву. Розглянемо приклад багатовимірного асоціативного масиву:

<?php
// Многомерный массив
$A["Ivanov"] = array("name"=>"Иванов И.И.", "age"=>"25", "email"=>"[email protected]");
$A["Petrov"] = array("name"=>"Петров П.П.", "age"=>"34", "email"=>"[email protected]");
$A["Sidorov"] = array("name"=>"Сидоров С.С.", "age"=>"47", "email"=>"[email protected]");
?>

Багатовимірні масиви схожі на записи в мові Pascal або структури в мові C.

Доступ до елементів багатовимірного асоціативного масиву здійснюється таким чином:

echo $A["Ivanov"]["name"]; // Выводит Иванов И.И.
echo $A["Petrov"]["email"]; // Выводит [email protected]

Як ви вже помітили, для створення багатовимірного асоціативного масиву ми використовували спеціальну функцію array, ми її розглянемо пізніше, коли будемо розглядати операції над масивами.

Асоціативні багатовимірні масиви можна створювати і класичним способом, хоча це не так зручно:

<?php
// Многомерный ассоциативный массив
$A["Ivanov"]["name"]="Иванов И.И.";
$A["Ivanov"]["age"]="25";
$A["Ivanov"]["email"]="[email protected]";
$A["Petrov"]["name"]="Петров П.П.";
$A["Petrov"]["age"]="34";
$A["Petrov"]["email"]="[email protected]";
$A["Sidorov"]["name"]="Сидоров С.С.";
$A["Sidorov"]["age"]="47";
$A["Sidorov"]["email"]="[email protected]";
// Получаем доступ к ключам многомерного ассоциативного массива
echo $A["Ivanov"]["name"]."<br>"; // Выводит Иванов И.И.
echo $A["Sidorov"]["age"]."<br>"; // Выводит 47
echo $A["Petrov"]["email"]."<br>"; // Выводит [email protected]
?>

Фукціі для роботи з масивами і операції над масивами

Функції для роботи з масивами

Розглянемо деякі основні функції для роботи з масивами.

Функція list()

Припустимо, у нас є масив, що складається з трьох елементів:

$names[0]="Александр";
$names[1]="Николай";
$names[2]="Яков";

Припустимо, в якийсь момент нам потрібно передати значення всіх трьох елементів масиву, відповідно трьом змінним: $alex, $nick, $yakov. Это можно сделать так:

$alex = $names[0];
$nick = $names[1];
$yakov = $names[2];

Якщо масив великий, то такий спосіб привласнення елементів масиву змінним не дуже зручний.

Є більш раціональний підхід - використання функції.:

list ($alex, $nick, $yakov) = $names;

Якщо нам потрібні тільки "Николай" и "Яков", тоді ми можемо зробити так:

list (, $nick, $yakov) = $names;

Функція array()

Функція використовується спеціально для створення масивів. При цьому вона дозволяє створювати порожні масиви. Методи використання функції Array():

<?php
// Создает пустой массив:
$arr = array();
// Создает список с тремя элементами. Индексы начинаются с нуля:
$arr2 = array("Иванов","Петров","Сидоров");
// Создает ассоциативный массив с тремя элементами:
$arr3 = array("Иванов"=>"Иван", "Петров"=>"Петр", "Сидоров"=>"Сидор");
// Создает многомерный ассоциативный массив:
$arr4 = array("name"=>"Иванов", "age"=>"24", "email"=>"[email protected]");
$arr4 = array("name"=>"Петров", "age"=>"34", "email"=>"[email protected]");
$arr4 = array("name"=>"Сидоров", "age"=>"47", "email"=>"[email protected]");
?>

Операции над массивами

Сортировка массивов

Начнем с самого простого — сортировки массивов. В PHP для этого существует очень много функций. С их помощью можно сортировать ассоциативные массивы и списки в порядке возрастания или убывания, а также в том порядке, в каком вам необходимо — посредством пользовательской функции сортировки.

Сортировка массива по значениям c помощью функций asort() и arsort():

Функция asort() сортирует массив, указанный в ее параметре, так, чтобы его значения шли в алфавитном (если это строки) или в возрастающем (для чисел) порядке.
При этом сохраняются связи между ключами и соответствующими им значениями, т. е. некоторые пары ключ=>значение просто "всплывают" наверх, а некоторые — наоборот, "опускаются". Например:

$A=array("a"=>"Zero","b"=>"Weapon","c"=>"Alpha","d"=>"Processor");
asort($A);
foreach($A as $k=>$v) echo "$k=>$v ";
// выводит "c=>Alpha d=>Processor b=>Weapon a=>Zero"
// как видим, поменялся только порядок пар ключ=>значение

Функция arsort() выполняет то же самое, за одним исключением: она упорядочивает массив не по возрастанию, а по убыванию.

Сортировка по ключам с помощью функций ksort() и krsort():

Функция ksort() практически идентична функции asort(), с тем различием, что сортировка осуществляется не по значениями, а по ключам (в порядке возрастания).
Например:

$A=array("d"=>"Zero", "c"=>"Weapon", "b"=>"Alpha", "a"=>"Processor");
ksort($A);
for(Reset($A); list($k,$v)=each($A);) echo "$k=>$v ";
// выводит "a=>Processor b=>Alpha c=>Weapon d=>Zero"

Функция для сортировки по ключам в обратном порядке называется krsort() и применяется точно в таком же контексте, что и ksort().

Сортировка по ключам при помощи функции uksort():

Довольно часто нам приходится сортировать что-то по более сложному критерию, чем просто по алфавиту. Например, пусть в $Files хранится список имен файлов и подкаталогов в текущем каталоге. Возможно, мы захотим вывести этот список не только в лексикографическом порядке, но также и чтобы все каталоги предшествовали файлам. В этом случае нам стоит воспользоваться функцией uksort(), написав предварительно функцию сравнения с двумя параметрами, как того требует uksort().

<?php
// Эта функция должна сравнивать значения $f1 и $f2 и nbsp;возвращать:
// -1, если $f1<$f2,
// 0, если $f1==$f2
// 1, если $f1>$f2
// Под < и > понимается следование этих имен в выводимом списке
function FCmp($f1,$f2)
{ // Каталог всегда предшествует файлу
if(is_dir($f1) && !is_dir($f2)) return -1;
// Файл всегда идет после каталога
if(!is_dir($f1) && is_dir($f2)) return 1;
// Иначе сравниваем лексикографически
if($f1<$f2) return -1; elseif($f1>$f2) return 1; else return 0;
}
// Пусть $Files содержит массив с ключами — именами файлов
// в текущем каталоге. Отсортируем его.
uksort($Files, "FCmp"); // передаем функцию сортировки "по ссылке"
?>

Конечно, связи между ключами и значениями функцией uksort() сохраняются, т. е., опять же, некоторые пары просто "всплывают" наверх, а другие — "оседают".

Сортировка по значениям при помощи функции uasort()

Функция uasort() очень похожа на uksort(), с той разницей, что сменной (пользовательской) функции сортировки "подсовываются" не ключи, а очередные значения из массива. При этом также сохраняются связи в парах ключ=>значение.

Переворачивание массива с помощью функции array_reverce()

Функция array_reverse() возвращает массив, элементы которого следуют в обратном порядке относительно массива, переданного в параметре. При этом связи между ключами и значениями, конечно, не теряются. Например, вместо того, чтобы ранжировать массив в обратном порядке при помощи arsort(), мы можем отсортировать его в прямом порядке, а затем перевернуть:

$A=array("a"=>"Zero","b"=>"Weapon","c"=>"Alpha","d"=>"Processor");
asort($A);
$A=array_reverse($A);

Конечно, указанная последовательность работает дольше, чем один-единственный вызов arsort().

Сортировка списка при помощи функций sort() и rsort()

Эти две функции предназначены в первую очередь для сортировки списков.

Функция sort() сортирует список (разумеется, по значениям) в порядке возрастания, а rsort() — в порядке убывания. Пример для функции sort():

<?php
$A=array("40", "20", "10", "30");
sort($A);
for($i=0; $i<count($A); $i++) echo "$A[$i]"."<br>";
// выводит 10 20 30 40
?>

Перемешивание списка с помощью функции shuffle()

Функция shuffle() "перемешивает" список, переданный ей первым параметром, так, чтобы его значения распределялись случайным образом. Обратите внимание, что, во-первых, изменяется сам массив, а во вторых, ассоциативные массивы восприимаются как списки. Пример:

$A=array(10,20,30,40,50);
shuffle($A);
foreach($A as $v) echo "$v ";

Приведенный фрагмент кода выводит числа 10, 20, 30, 40 и 50 в случайном порядке.

Выполнив этот фрагмент несколько раз, вы можете обнаружить, что от запуска к запуску очередность следования чисел не изменяется. Это свойство обусловлено тем, что функция shuffle() использует стандартный генератор случайных чисел, который перед работой необходимо инициализировать при
помощи вызова srand().

Операции с ключами и значениями массива

array_flip(array $arr)

Функция array_flip() "пробегает" по массиву и меняет местами его ключи и значения. Исходный массив $arr не изменяется, а результирующий массив просто возвращается.
Конечно, если в массиве присутствовали несколько элементов с одинаковыми значениями, учитываться будет только последний из них:

$A=array("a"=>"aaa", "b"=>"aaa", "c"=>"ccc");
$A=array_flip($A);
// теперь $A===array("aaa"=>"b", "ccc"=>"c");

array_keys(array $arr [,mixed $SearchVal])

Функция array_keys() возвращает список, содержащий все ключи массива $arr. Если задан необязательный параметр $SearchVal, то она вернет только те ключи, которым соответствуют значения $SearchVal.

Фактически, эта функция с заданным вторым параметром является обратной по отношению к оператору [] — извлечению значения по его ключу.

array_values(array $arr)

Функция array_values() возвращает список всех значений в ассоциативном массиве $arr. Очевидно, такое действие бесполезно для списков, но иногда оправдано для хэшей.

in_array(mixed $val, array $arr)

Функция in_array() возвращает true, если элемент со значением $val присутствует в массиве $arr.
Впрочем, если вам часто приходится проделывать эту операцию, подумайте: не лучше ли будет воспользоваться ассоциативным массивом и хранить данные в его ключах, а не в значениях? На этом вы можете сильно выиграть в быстродействии.

array_count_values(list $List)

Функция array_count_values() подсчитывает, сколько раз каждое значение встречается в списке $List, и возвращает ассоциативный массив с ключами — элементами списка и значениями — количеством повторов этих элементов. Иными словами, функция array_count_values() подсчитывает частоту появления значений в списке $List. Пример:

$List=array(1, "hello", 1, "world", "hello");
array_count_values($array);
// возвращает array(1=>2, "hello"=>2, "world"=>1)