<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>LXF71:PHP - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF71:PHP&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Wed, 13 May 2026 20:58:33 GMT</lastBuildDate>
		<item>
			<title>Yaleks: /* Кроссворды */ викификация</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF71:PHP&amp;diff=5835&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Кроссворды -&lt;/span&gt; викификация&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 17:06, 6 декабря 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 316:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 316:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;сохранять состояние решения? Для решения всех этих проблем нам потребуется «правильный» XML, в котором каждый квадратик описывается&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;сохранять состояние решения? Для решения всех этих проблем нам потребуется «правильный» XML, в котором каждый квадратик описывается&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;отдельным элементом. Эти квадратные элементы могут иметь следующие атрибуты:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;отдельным элементом. Эти квадратные элементы могут иметь следующие атрибуты:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;type- &lt;/del&gt;тип квадратика, black(чёрный) или white (белый).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;type — &lt;/ins&gt;тип квадратика, black(чёрный) или white (белый).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;number- &lt;/del&gt;номер слова (если есть)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;number — &lt;/ins&gt;номер слова (если есть)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;direction- &lt;/del&gt;направление слова, down (вниз), across (вправо) или both (оба), если есть.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;direction — &lt;/ins&gt;направление слова, down (вниз), across (вправо) или both (оба), если есть.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;downclue- &lt;/del&gt;вопрос для слова, идущего вниз, если есть.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;downclue — &lt;/ins&gt;вопрос для слова, идущего вниз, если есть.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;acrossclue- &lt;/del&gt;вопрос для слова, идущего вправо, если есть.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;acrossclue — &lt;/ins&gt;вопрос для слова, идущего вправо, если есть.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;correctanswer- &lt;/del&gt;буква, которая должна быть тут.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;correctanswer — &lt;/ins&gt;буква, которая должна быть тут.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;currentanswer- &lt;/del&gt;буква, которую сюда написал отгадчик.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;currentanswer — &lt;/ins&gt;буква, которую сюда написал отгадчик.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;guessedanswer- &lt;/del&gt;буква, в которой отгадчик не уверен.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;guessedanswer — &lt;/ins&gt;буква, в которой отгадчик не уверен.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Мы отсортируем элементы так, что сначала укажем первую строчку,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Мы отсортируем элементы так, что сначала укажем первую строчку,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;потом вторую и так далее. Элемент &amp;lt;grid&amp;gt; будет хранить свойства — автора, сложность (номер от 1 до 4, 4 — самый сложный), и размер сетки (6&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;потом вторую и так далее. Элемент &amp;lt;grid&amp;gt; будет хранить свойства — автора, сложность (номер от 1 до 4, 4 — самый сложный), и размер сетки (6&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Sat, 06 Dec 2008 17:06:21 GMT</pubDate>			<dc:creator>Yaleks</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF71:PHP</comments>		</item>
		<item>
			<title>Yaleks: /* Кроссворды */</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF71:PHP&amp;diff=5834&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Кроссворды&lt;/span&gt;&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 17:05, 6 декабря 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 272:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 272:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Кроссворды ===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Кроссворды ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|Заголовок=подсКАЗКА&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|Содержание=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;; Несколько выражений&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Возможно выполнять проверку&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;нескольких условий за один раз.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Например, вы хотите получить&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;список имен глав штатов стран&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Северной Америки, но только при&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;том условии что у них есть дети.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$na_hos_with_kids = &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;$countries-&amp;gt;XPath(&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'/countries/country[continent=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;quot;North America&amp;quot;]/headofstate[&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;haschildren = true()]/name');&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Да, это работает, и нет, это нелегко&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;прочитать. Но это всё, что у нас&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;есть.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|Ширина=250px}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;теперь, когда мы представляем, как работает SimpleXML, самое время&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;теперь, когда мы представляем, как работает SimpleXML, самое время&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;обратиться к задаче хранения кроссвордов. кроссворды можно рассматривать как большие сетки (как и Sudoku), в которых каждый элемент&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;обратиться к задаче хранения кроссвордов. кроссворды можно рассматривать как большие сетки (как и Sudoku), в которых каждый элемент&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 346:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 365:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;До встречи!&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;До встречи!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|center|&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|Заголовок=подсКАЗКи дЛя SUDOKU, чАстЬ 2&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|Содержание=я продолжаю давать подсказки, которые могут помочь вам&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;выиграть приз за решение загадки Sudoku. я молодец,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;правда?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Создайте функцию под названием solve(), которая принимает квадрат как параметр и пытается поместить в него какое-нибудь число.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Внутри функции solve() сделайте вызовы других функций, которые пытаются решить задачу разными способами, например solveTwin(), solveBrute() и так далее. Это позволит вам в будущем упорядочить методы решения по производительности.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Используйте упорядоченный массив для предполагаемых решений. Помните, вашей программе, возможно, придётся сделать много предположений.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Напишите три функции, возвращающие строку, столбец или квадрат для данного элемента. Вам придётся часто ими пользоваться, так что эти функции окажутся очень кстати.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Не пробуйте написать сложное многопоточное решение. Если вы не глупы, ваш код и так получится достаточно быстрым.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Для самого простого решения используйте случайные числа, чтобы определить откуда начинать. А чтобы оценить трудность, запустить решение трижды и посчитайте среднее число шагов, потребовавшееся для решения.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Для более интеллектуального решения анализируйте состояние на доске и разумно выбирайте точку для следующего предположения. Это сложнее, так что сначала напишите систему случайного поиска, а затем отталкивайтесь от нее – гораздо лучше реализовать только базовый алгоритм, чем не иметь алгоритма вообще.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Думаю, на сегодня подсказок достаточно, но вы можете&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;посмотреть в предыдущий номер, чтобы найти еще&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;немного. Если вам повезёт, то вы получите третий набор&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;советов в следующем выпуске, но вы должны следовать&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;нашему пути, чтобы они вам пригодились.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|Ширина=}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Sat, 06 Dec 2008 17:05:34 GMT</pubDate>			<dc:creator>Yaleks</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF71:PHP</comments>		</item>
		<item>
			<title>Yaleks: викификация</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF71:PHP&amp;diff=5833&amp;oldid=prev</link>
			<description>&lt;p&gt;викификация&lt;/p&gt;
&lt;a href=&quot;http://wiki2.linuxformat.ru/index.php?title=LXF71:PHP&amp;amp;diff=5833&amp;amp;oldid=5832&quot;&gt;(Различия между версиями)&lt;/a&gt;</description>
			<pubDate>Sat, 06 Dec 2008 16:58:36 GMT</pubDate>			<dc:creator>Yaleks</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF71:PHP</comments>		</item>
		<item>
			<title>Yaleks в 16:57, 6 декабря 2008</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF71:PHP&amp;diff=5832&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://wiki2.linuxformat.ru/index.php?title=LXF71:PHP&amp;amp;diff=5832&amp;amp;oldid=5831&quot;&gt;(Различия между версиями)&lt;/a&gt;</description>
			<pubDate>Sat, 06 Dec 2008 16:57:30 GMT</pubDate>			<dc:creator>Yaleks</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF71:PHP</comments>		</item>
		<item>
			<title>Yaleks: Новая: {{Цикл/PHP}}  == SimpleXML и XPath == '''''Пол Хадсон''' (Paul Hudson) вновь пытается помочь с решенем загадки Sudoku и погружае...</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF71:PHP&amp;diff=5831&amp;oldid=prev</link>
			<description>&lt;p&gt;Новая: {{Цикл/PHP}}  == SimpleXML и XPath == '''''Пол Хадсон''' (Paul Hudson) вновь пытается помочь с решенем загадки Sudoku и погружае...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/PHP}}&lt;br /&gt;
&lt;br /&gt;
== SimpleXML и XPath ==&lt;br /&gt;
'''''Пол Хадсон''' (Paul Hudson) вновь пытается помочь с решенем загадки Sudoku и погружается в изучение XML для дела и удовольствия.''&lt;br /&gt;
&lt;br /&gt;
одна из многих латинских поговорок, приписываемых юлию&lt;br /&gt;
Цезарю, звучит так: «Beati Hispani quibus vivere bibere est». В&lt;br /&gt;
свободном переводе это значит: «блаженны испанцы, для&lt;br /&gt;
которых жить – значит пить». И кто с этим не согласится? Но мало кто&lt;br /&gt;
знает, что эта фраза очень похоже прозвучит в современной Испании.&lt;br /&gt;
там вы можете сказать “Dichosos los espaсoles, para quienes vivir es&lt;br /&gt;
beber.” Любой, хорошо знакомый с испанским языком, может посмот-&lt;br /&gt;
реть на фразу на латыни и догадаться о её значении, благодаря тому&lt;br /&gt;
факту что испанский язык относится к романской группе – не из-за сво-&lt;br /&gt;
ей романтичности, а потому что он происходит от разговорного латинско-&lt;br /&gt;
го языка, на котором говорили римляне (Romans) много лет назад.&lt;br /&gt;
Удивительно, но в компьютерных науках наблюдается такая же сте-&lt;br /&gt;
пень стандартизации. Несмотря на то, что мы никак не можем догово-&lt;br /&gt;
риться, сколько кнопок должно быть на мышке, мы при этом способны&lt;br /&gt;
создавать системы для обмена данными в понятной форме. XML (the&lt;br /&gt;
eXtensible Markup Language, расширяемый язык разметки) – это формат&lt;br /&gt;
данных, основанный на текстовом представлении, позволяющий легко&lt;br /&gt;
читать и сохранять данные, а так же делиться ими с другими, в том чис-&lt;br /&gt;
ле и через Интернет. как латынь и языки романской группы, разные XML-&lt;br /&gt;
схемы (правила, по которым создаются XML-файлы) отличаются друг от&lt;br /&gt;
друга, но не настолько, чтобы другие стали непонятными, если вам зна-&lt;br /&gt;
кома только одна из них. В сегодняшней статье мы рассмотрим XML для&lt;br /&gt;
сохранения кроссвордов: мы будем читать их, записывать и показывать&lt;br /&gt;
на экране. Мы не собираемся их разгадывать – мы займёмся совершен-&lt;br /&gt;
но другой проблемой.&lt;br /&gt;
&lt;br /&gt;
=== Зачем использовать XML ===&lt;br /&gt;
Даже теперь, когда XML присутствует везде, мы всё еще видим разнооб-&lt;br /&gt;
разие форматов. Причина этого проста – XML несовершенен. он очень&lt;br /&gt;
многословен, он не имеет строгой типизации, он понятен для человека и&lt;br /&gt;
поэтому заметно медленнее бинарных форматов данных. Но у него есть&lt;br /&gt;
свои достоинства. Главные из них – возможность проверить коррект-&lt;br /&gt;
ность файла, не имея представления о его схеме, поддержка Unicode,&lt;br /&gt;
возможности самодокументирования и жёсткие синтаксические правила,&lt;br /&gt;
позволяющие быстро и безошибочно читать XML-файл.&lt;br /&gt;
В общем, XML силён несмотря на все свои проблемы, потому что он&lt;br /&gt;
позволяет легко обмениваться данными между различными программа-&lt;br /&gt;
ми, в том числе и через Интернет. Используя его для сохранения крос-&lt;br /&gt;
свордов, мы можем быть уверены что при желании другие программы&lt;br /&gt;
смогу легко воспользоваться ими. Если вы читали о возможностях техно-&lt;br /&gt;
логии Ajax, то вы уже знаете о возможностях, которые даёт XML при про-&lt;br /&gt;
граммировании на стороне клиента. Если у вас нет каких-то специфичес-&lt;br /&gt;
ких требований, для большинства проектов XML подходит лучше всего.&lt;br /&gt;
&lt;br /&gt;
=== создание простого XML ===&lt;br /&gt;
Поддержка XML в PHP находится в очень неустойчивом положении. С&lt;br /&gt;
момента её появления было создано множество разных реализаций,&lt;br /&gt;
несколько переработок и серия расширений, предназначенных для чте-&lt;br /&gt;
ния и записи XML. Последнее из них, SimpleXML (простой XML), так&lt;br /&gt;
называется потому, что предназначено для представления XML-файла в&lt;br /&gt;
виде простых переменных PHP.&lt;br /&gt;
Вот пример XML-файла под названием requiem.xml:&lt;br /&gt;
&amp;lt;requiem&amp;gt;&lt;br /&gt;
&amp;lt;line&amp;gt;&lt;br /&gt;
&amp;lt;latin&amp;gt;Confutatis maledictis&amp;lt;/latin&amp;gt;&lt;br /&gt;
&amp;lt;english&amp;gt;When the wicked are confounded&amp;lt;/english&amp;gt;&lt;br /&gt;
&amp;lt;/line&amp;gt;&lt;br /&gt;
&amp;lt;line&amp;gt;&lt;br /&gt;
&amp;lt;latin&amp;gt;Flammis acribus addictis&amp;lt;/latin&amp;gt;&lt;br /&gt;
&amp;lt;english&amp;gt;Doomed to flames of woe unbounded&amp;lt;/english&amp;gt;&lt;br /&gt;
&amp;lt;/line&amp;gt;&lt;br /&gt;
&amp;lt;/requiem&amp;gt;&lt;br /&gt;
В этом примере корневым элементом является requiem. он содер-&lt;br /&gt;
жит два элемента line, в которых в свою очередь находятся latin и&lt;br /&gt;
english – как видите, тут нет ничего мудрёного. Мы можем разобрать&lt;br /&gt;
этот файл и напечатать результат разбора с помощью двух строк на PHP:&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$file = simplexml_load_file(“requiem.xml”);&lt;br /&gt;
var_dump($file);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
Функция var_dump даёт прекрасную возможность разобраться, как&lt;br /&gt;
что-то работает в PHP, так как она позволяется наглядно увидеть данные,&lt;br /&gt;
содержащиеся в переменной. Вот, что выводит наша программа:&lt;br /&gt;
object(SimpleXMLElement)#1 (1) {&lt;br /&gt;
[“line”]=&amp;gt;&lt;br /&gt;
array(2) {&lt;br /&gt;
[0]=&amp;gt;&lt;br /&gt;
object(SimpleXMLElement)#2 (2) {&lt;br /&gt;
[“latin”]=&amp;gt;&lt;br /&gt;
string(21) “Confutatis maledictis”&lt;br /&gt;
[“english”]=&amp;gt;&lt;br /&gt;
string(30) “When the wicked are confounded”&lt;br /&gt;
}&lt;br /&gt;
[1]=&amp;gt;&lt;br /&gt;
object(SimpleXMLElement)#3 (2) {&lt;br /&gt;
[“latin”]=&amp;gt;&lt;br /&gt;
string(25) “Flammis acribus addictis”&lt;br /&gt;
[“english”]=&amp;gt;&lt;br /&gt;
string(33) “Doomed to flames of woe unbounded”&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
Понимание этой структуры – это ключ к использованию SimpleXML.&lt;br /&gt;
Корневой объект SimpleXMLElement содержит только одну пере-&lt;br /&gt;
менную, line. О на является массивом из двух элементов (с номерами 0&lt;br /&gt;
и 1), соответствующих двум элементам &amp;lt;line&amp;gt; в исходном файле. Эти&lt;br /&gt;
элементы, в свою очередь, являются объектами SimpleXMLElement,&lt;br /&gt;
содержащими строковые переменные latin и english с соответствующи-&lt;br /&gt;
ми данными из исходного XML. Итак, вызов функции simplexml_load_&lt;br /&gt;
file вернул нам смесь из объектов и массивов, соответствующую струк-&lt;br /&gt;
туре XML-файла и содержащий все его данные в обычных переменных&lt;br /&gt;
php. Вывод var_dump познавателен, но непригоден для нормальной&lt;br /&gt;
работы, так что давайте перепишем нашу программу так, чтобы она печа-&lt;br /&gt;
тала только английский текст:&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$file = simplexml_load_file(“requiem.xml”);&lt;br /&gt;
foreach($file-&amp;gt;line as $line) {&lt;br /&gt;
echo $line-&amp;gt;english, “\n”;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
Обратите внимание на то, как мы используем $file-&amp;gt;line и $line-&lt;br /&gt;
&amp;gt;english. Т ак как $file и $line – объекты, мы можем получить доступ к&lt;br /&gt;
их переменным при помощи оператора -&amp;gt;. Ничего не мешает вам тракто-&lt;br /&gt;
вать объекты как массивы. Например, использовав их внутри цикла&lt;br /&gt;
foreach, можно перебирать все поля объекта по одному, словно это эле-&lt;br /&gt;
менты массива. Но лучше всё же мысленно различать объекты и масси-&lt;br /&gt;
вы, так как SimpleXML использует «массивоподобный» метод для пред-&lt;br /&gt;
ставления атрибутов. Например, если изменить первую строчку нашего&lt;br /&gt;
XML следующим образом:&lt;br /&gt;
&amp;lt;requiem key=”D”&amp;gt;&lt;br /&gt;
то теперь с разобранным файлом вы можете сделать следующее:&lt;br /&gt;
$file = simplexml_load_file(“requiem.xml”);&lt;br /&gt;
print $file[“key”];&lt;br /&gt;
Этот код отобразит значение атрибута key корневого элемента.&lt;br /&gt;
Синтаксис $file-&amp;gt;key не сработает, так как он обозначает обращение ко&lt;br /&gt;
вложенному элементу &amp;lt;key&amp;gt;, которого не существует. Да, это похоже на&lt;br /&gt;
чёрную магию, мы привыкли к тому что операторы массивов работают по&lt;br /&gt;
другому. Всё дело в том, что здесь приходится работать с объектами&lt;br /&gt;
SimpleXMLElement, а не с обычными плоскими массивами.&lt;br /&gt;
&lt;br /&gt;
=== XML на входе, объекты на выходе ===&lt;br /&gt;
Как вы только что могли убедиться, SimpleXML позволяет вам работать с&lt;br /&gt;
XML-файлами так же, как с объектами и массивами, так что вы можете&lt;br /&gt;
игнорировать семантику XML и сосредоточиться на правильной обработ-&lt;br /&gt;
ке данных. Эта простота использования простирается вплоть до возмож-&lt;br /&gt;
ности изменять значения переменных, поскольку раз уж у вас есть объекты и массивы php, то вы можете делать с ними всё, что пожелаете. Что&lt;br /&gt;
более интересно, после внесения изменений вы можете экспортировать&lt;br /&gt;
результат обратно в XML. Для демонстрации этого мы используем&lt;br /&gt;
новый XML файл:&lt;br /&gt;
&amp;lt;park&amp;gt;&lt;br /&gt;
&amp;lt;squirrel name=”Squirly”&amp;gt;&lt;br /&gt;
&amp;lt;nuts&amp;gt;320&amp;lt;/nuts&amp;gt;&lt;br /&gt;
&amp;lt;/squirrel&amp;gt;&lt;br /&gt;
&amp;lt;squirrel name=”Nick”&amp;gt;&lt;br /&gt;
&amp;lt;nuts&amp;gt;0&amp;lt;/nuts&amp;gt;&lt;br /&gt;
&amp;lt;/squirrel&amp;gt;&lt;br /&gt;
&amp;lt;/park&amp;gt;&lt;br /&gt;
И так, в нашем парке (park) есть две белки (squirrel) по имени Squirly&lt;br /&gt;
и Nick. У Squirly много орехов (nuts), а у Nick’а ничего нет. Чтобы это&lt;br /&gt;
исправить, воспользуемся умением SimpleXML изменять значения пере-&lt;br /&gt;
менных на лету. Сделать это действительно просто:&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$park = simplexml_load_file(“squirrels.xml”);&lt;br /&gt;
$park-&amp;gt;squirrel[1]-&amp;gt;nuts = 10;&lt;br /&gt;
print $park-&amp;gt;asXML();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
Этот сценарий превращает парк с белками в обычный набор объек-&lt;br /&gt;
тов и массивов, получает доступ к одной из белок (второй, так как эле-&lt;br /&gt;
менты нумеруются начиная с нуля, то есть squirrel[1] – это Nick) и изме-&lt;br /&gt;
няет число её орехов. Важной частью является вызов asXML, так как он&lt;br /&gt;
позволяет превратить наши объекты снова в XML, и это лучший XML чем&lt;br /&gt;
тот, с которого мы начинали:&lt;br /&gt;
&amp;lt;?xml version=”1.0”?&amp;gt;&lt;br /&gt;
&amp;lt;park&amp;gt;&lt;br /&gt;
&amp;lt;squirrel name=”Squirly”&amp;gt;&lt;br /&gt;
&amp;lt;nuts&amp;gt;320&amp;lt;/nuts&amp;gt;&lt;br /&gt;
&amp;lt;/squirrel&amp;gt;&lt;br /&gt;
&amp;lt;squirrel name=”Nick”&amp;gt;&lt;br /&gt;
&amp;lt;nuts&amp;gt;10&amp;lt;/nuts&amp;gt;&lt;br /&gt;
&amp;lt;/squirrel&amp;gt;&lt;br /&gt;
&amp;lt;/park&amp;gt;&lt;br /&gt;
Nick обзавёлся орехами, а весь файл – заголовком с обозначением&lt;br /&gt;
версии, которого у нас не было раньше. Метод asXML доступен для&lt;br /&gt;
любого объекта SimpleXMLElement, так что вы можете получить XML&lt;br /&gt;
одного только Nick-а при помощи $park-&amp;gt;squirrel[1]-&amp;gt;asXML().&lt;br /&gt;
Обратите внимание: при использовании asXML для любого другого&lt;br /&gt;
объекта, кроме корневого, XML-заголовок с версией не вставляется, вы&lt;br /&gt;
получите только кусочек XML-кода. После получения текстовой строки в&lt;br /&gt;
нужном формате воспользуйтесь функцией file_put_contents для&lt;br /&gt;
сохранения её в файле по вашему выбору.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы увеличить возможности XML, было разработано&lt;br /&gt;
множество стандартов, самый известный из которых – Xpath. он делает&lt;br /&gt;
XML более похожим на SQL – теперь вы можете не просто использовать&lt;br /&gt;
его для хранения информации, но и выполнять запросы. По своей сути&lt;br /&gt;
Xpath – это способ вытащить нужную часть XML, указав путь к ней (похо-&lt;br /&gt;
жий на путь к файлу в файловой системе). В PHP это достигается воз-&lt;br /&gt;
вращением массива объектов SimpleXMLElement, соответствующих&lt;br /&gt;
вашему запросу.&lt;br /&gt;
&lt;br /&gt;
=== первые шаги по Xpath ===&lt;br /&gt;
Представляю вам новый XML, books.xml:&lt;br /&gt;
&amp;lt;books&amp;gt;&lt;br /&gt;
&amp;lt;author nationality=”British” name=”Jane Austen”&amp;gt;&lt;br /&gt;
&amp;lt;book&amp;gt;Pride And Prejudice&amp;lt;/book&amp;gt;&lt;br /&gt;
&amp;lt;book&amp;gt;Sense And Sensibility&amp;lt;/book&amp;gt;&lt;br /&gt;
&amp;lt;/author&amp;gt;&lt;br /&gt;
&amp;lt;author nationality=”Colombian” name=”Gabriel Garcia Marquez”&amp;gt;&lt;br /&gt;
&amp;lt;book&amp;gt;Cien anos de soledad&amp;lt;/book&amp;gt;&lt;br /&gt;
&amp;lt;book&amp;gt;El coronel no tiene quien le escriba&amp;lt;/book&amp;gt;&lt;br /&gt;
&amp;lt;/author&amp;gt;&lt;br /&gt;
&amp;lt;author nationality=”British” name=”David Baddiel”&amp;gt;&lt;br /&gt;
&amp;lt;book&amp;gt;Time For Bed&amp;lt;/book&amp;gt;&lt;br /&gt;
&amp;lt;book&amp;gt;The Secret Purposes&amp;lt;/book&amp;gt;&lt;br /&gt;
&amp;lt;/author&amp;gt;&lt;br /&gt;
&amp;lt;/books&amp;gt;&lt;br /&gt;
он содержит трёх авторов (&amp;lt;author&amp;gt;), из которых двое англичане, и&lt;br /&gt;
для всех троих указаны их книги. С помощью Xpath мы можем запросить&lt;br /&gt;
список всех книг:&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$authors = simplexml_load_file(“books.xml”);&lt;br /&gt;
$books = $authors-&amp;gt;XPath(“//book”);&lt;br /&gt;
foreach($books as $book) {&lt;br /&gt;
echo $book, “\n”;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
Запрос «//book» ищет элемент &amp;lt;book&amp;gt; в любом месте дерева XML.&lt;br /&gt;
Часть запроса // значит “искать везде”, что для функции xpath значит&lt;br /&gt;
«найти все корневые элементы &amp;lt;book&amp;gt;, найти все &amp;lt;book&amp;gt; внутри элемен-&lt;br /&gt;
та, содержащего &amp;lt;author&amp;gt;, найти все &amp;lt;book&amp;gt; внутри элементов &amp;lt;author&amp;gt;»,&lt;br /&gt;
то есть найти &amp;lt;book&amp;gt; вообще везде, и вернуть все найденные элементы&lt;br /&gt;
в одном массиве. Затем мы передаём полученный массив в цикл&lt;br /&gt;
foreach и печатаем его. Есть один любопытный момент: если вместо print&lt;br /&gt;
использовать var_dump($book), вы увидите, что в переменной на&lt;br /&gt;
самом деле хранится SimpleXMLElement. Это часть той же магии,&lt;br /&gt;
которая позволяет работать с объектами SimpleXML как с массивами. В&lt;br /&gt;
нашем случае это магия функции __tostring(), позволяющая использо-&lt;br /&gt;
вать объект в операторе print как обычную строку.&lt;br /&gt;
Если вы хотите добыть конкретную книгу, Xpath поможет вам и в&lt;br /&gt;
этом. Например, добавьте следующий код к books.xml сразу перед стро-&lt;br /&gt;
кой &amp;lt;/books&amp;gt;:&lt;br /&gt;
&amp;lt;library name=”British Library”&amp;gt;&lt;br /&gt;
&amp;lt;book&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;The Peloponnesian War&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;author&amp;gt;Donald Kagan&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/book&amp;gt;&lt;br /&gt;
&amp;lt;book&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;The Peloponnesian War&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;author&amp;gt;Thucidydes&amp;lt;/author&amp;gt;&lt;br /&gt;
&amp;lt;/book&amp;gt;&lt;br /&gt;
&amp;lt;/library&amp;gt;&lt;br /&gt;
теперь элементов &amp;lt;book&amp;gt; у нас стало больше, но они разные – эле-&lt;br /&gt;
менты внутри &amp;lt;author&amp;gt; обозначают, какие книги этими авторами были&lt;br /&gt;
написаны, а &amp;lt;book&amp;gt; внутри &amp;lt; library&amp;gt; - это список книг, имеющихся в биб-&lt;br /&gt;
лиотеке. Если по-прежнему использовать строку поиска //book, то мы&lt;br /&gt;
получим их все, вне зависимости от того, есть эта книга в библиотеке&lt;br /&gt;
или нет.&lt;br /&gt;
Для выполнения более точного поиска можно воспользоваться&lt;br /&gt;
иерархией XML:&lt;br /&gt;
$books = $authors-&amp;gt;XPath(“/books/library/book”);&lt;br /&gt;
Этот запрос вернёт все книги в библиотеке, не затронув книги авто-&lt;br /&gt;
ров. Помните, что он по прежнему возвращает массив из&lt;br /&gt;
SimpleXMLElement, то есть вы получите объекты со свойствами title и&lt;br /&gt;
author. Чтобы получить только заголовки, можно воспользоваться запро-&lt;br /&gt;
сом /books/library/book/title, но если нам надо и заголовки и авторов,&lt;br /&gt;
то лучше запросить именно книги, а затем воспользоваться объектно-&lt;br /&gt;
ориентированным синтаксисом:&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$all_books = simplexml_load_file(“books.xml”);&lt;br /&gt;
$library_books = $all_books-&amp;gt;XPath(“/books/library/book”);&lt;br /&gt;
foreach($library_books as $book) {&lt;br /&gt;
echo “{$book-&amp;gt;title} was written by {$book-&amp;gt;author}\n”;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
XML нельзя назвать быстрым, но XPath – уже можно, так как в&lt;br /&gt;
момент его использования XML преобразован во внутреннее представле-&lt;br /&gt;
ние, поиск по которому происходит сравнительно легко.&lt;br /&gt;
&lt;br /&gt;
=== разделяй и запрашивай ===&lt;br /&gt;
XPath позволяет фильтровать полученный массив элементов с помощью&lt;br /&gt;
небольшого набора условий. Например, мы можем запросить список&lt;br /&gt;
только английских авторов.&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$all_books = simplexml_load_file(“books.xml”);&lt;br /&gt;
$british_authors = $all_books-&amp;gt;XPath(‘/books/author[@nationality=”British”&lt;br /&gt;
]’);&lt;br /&gt;
foreach($british_authors as $author) {&lt;br /&gt;
echo “{$author[“name”]} is British.\n”;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
ключевая часть запроса заключена в квадратные скобки. Мы указы-&lt;br /&gt;
ваем, что хотим получить элемент author, вложенный в books, а в квад-&lt;br /&gt;
ратных скобках содержится фильтр, которому должны удовлетворять&lt;br /&gt;
наши элементы. @nationality обоозначает “Выбрать только такие эле-&lt;br /&gt;
менты, у которых параметр nationality...” и далее написано условие&lt;br /&gt;
“=British”. Это условие позволяет ограничить поиск только английскими&lt;br /&gt;
авторами. Символ @ имеет важное значение, без него условие применя-&lt;br /&gt;
лось бы к вложенным элементам, а не к атрибутам. Например, запрос&lt;br /&gt;
books/author[book=”Cien anos de soledad”] вернёт “Gabriel&lt;br /&gt;
Garcia Marquez”.&lt;br /&gt;
&lt;br /&gt;
кроме проверки на равенство вы можете использовать стандартные&lt;br /&gt;
условия &amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;= и !=, а так же соединять несколько условий при&lt;br /&gt;
помощи or или and.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$club_1830_eligible = $holidaymakers-&amp;gt;XPath(‘/books/author[@age&amp;gt;=18 or @age&amp;lt;=30]’);&amp;lt;/source&amp;gt;&lt;br /&gt;
кроме того, условия можно заключать в скобки, примерно так:&lt;br /&gt;
/books/author[@age&amp;gt;=18 and (@name=”Jim” or @&lt;br /&gt;
name=”Bob”)].&lt;br /&gt;
&lt;br /&gt;
кроме операторов сравнения, в условиях XPath доступны простые&lt;br /&gt;
математические действия. В их число входят +, -, *, div и mod. Вот&lt;br /&gt;
несколько примеров Xpath-запросов с фильтрованием:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$blessed = $people-&amp;gt;XPath('//person[nationality=&amp;quot;Spanish&amp;quot;]');&lt;br /&gt;
$meaning_of_life = $earth-&amp;gt;XPath('//monkeys[@favouritenumber = 7 * 6]');&lt;br /&gt;
$a_grade_freshmen = $university-&amp;gt;XPath('/students/student[@year = 1 and grades &amp;gt; 80.0'];&lt;br /&gt;
$dangerous = $people-&amp;gt;XPath('//adults[@iq = @shoesize]'); // обратите внимание, мы можем сравнивать значение атрибутов между собой&lt;br /&gt;
$squirrels_with_comedy _oversized_tails = $animals-&amp;gt;XPath('//squirrels[@tail &amp;gt; @body-length * 6]');&lt;br /&gt;
$offenders = $people-&amp;gt;XPath('//people/[@outstanding_penalty = true()]'); //возвращает записи, имеющие параметр outstanding_penalty, пустой или с любым значением&lt;br /&gt;
$good_wines = $wines-&amp;gt;XPath('/drinks/alcoholic/wines/wine[@year mod 2 = 1 and (@country=&amp;quot;Australia&amp;quot; or @country=&amp;quot;France&amp;quot;)]');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
я думаю, посмотрев на этот код вы согласитесь, что сложные выра-&lt;br /&gt;
жения в XML тяжело читаются и поэтому их лучше избегать.&lt;br /&gt;
&lt;br /&gt;
=== Кроссворды ===&lt;br /&gt;
теперь, когда мы представляем, как работает SimpleXML, самое время&lt;br /&gt;
обратиться к задаче хранения кроссвордов. кроссворды можно рассматривать как большие сетки (как и Sudoku), в которых каждый элемент&lt;br /&gt;
должен быть заполнен в процессе решения (опять же, полная аналогия с&lt;br /&gt;
Sudoku). так что задачи практически совпадают.&lt;br /&gt;
&lt;br /&gt;
Существует два способа хранения таких данных. “Чистое” решение –&lt;br /&gt;
это хранение каждой клеточки в отдельном XML-элементе. Другой вариант – сделать один элемент в XML-файле, который состоит из символов,&lt;br /&gt;
образующих сетку. Давайте рассмотрим сначала второй вариант как&lt;br /&gt;
более простой:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;crossword&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;My Excellent Crossword&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;grid&amp;gt;&lt;br /&gt;
-l--t-&lt;br /&gt;
-linux&lt;br /&gt;
-a--l-&lt;br /&gt;
-m--i-&lt;br /&gt;
-agape&lt;br /&gt;
------&lt;br /&gt;
&amp;lt;/grid&amp;gt;&lt;br /&gt;
&amp;lt;/crossword&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
Чтобы загрузить такой кроссворд, надо получить текст элемента grid&lt;br /&gt;
и затем разобрать его посимвольно. Но это не очень хорошее решение.&lt;br /&gt;
как хранить номера слов в кроссворде? как добавить вопросы? как&lt;br /&gt;
сохранять состояние решения? Для решения всех этих проблем нам потребуется “правильный” XML, в котором каждый квадратик описывается&lt;br /&gt;
отдельным элементом. Эти квадратные элементы могут иметь следующие атрибуты:&lt;br /&gt;
* type– тип квадратика, black(чёрный) или white (белый).&lt;br /&gt;
* number– номер слова (если есть)&lt;br /&gt;
* direction– направление слова, down (вниз), across (вправо) или both (оба), если есть.&lt;br /&gt;
* downclue– вопрос для слова, идущего вниз, если есть.&lt;br /&gt;
* acrossclue– вопрос для слова, идущего вправо, если есть.&lt;br /&gt;
* correctanswer– буква, которая должна быть тут.&lt;br /&gt;
* currentanswer– буква, которую сюда написал отгадчик.&lt;br /&gt;
* guessedanswer– буква, в которой отгадчик не уверен.&lt;br /&gt;
Мы отсортируем элементы так, что сначала укажем первую строчку,&lt;br /&gt;
потом вторую и так далее. Элемент &amp;lt;grid&amp;gt; будет хранить свойства – автора, сложность (номер от 1 до 4, 4 – самый сложный), и размер сетки ( 6&lt;br /&gt;
значит шесть квадратиков вправо и вниз).&lt;br /&gt;
&lt;br /&gt;
Чтобы сэкономить пространство в журнале, я приведу пример крос-&lt;br /&gt;
сворда 3x3:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;grid author=”Paul Hudson” difficulty=”1” size=”3”&amp;gt;&lt;br /&gt;
&amp;lt;square type=”white” number=”1” direction=”both” downclue=”Water stopper” acrossclue=”Four-legged cathater” correct=”d” current=”” guessed=”” /&amp;gt;&lt;br /&gt;
&amp;lt;square type=”white” correct=”o” current=”” guessed=”” /&amp;gt;&lt;br /&gt;
&amp;lt;square type=”white” number=”2” direction=”down” downclue=”Water stopper” correct=”g” current=”” guessed=”” /&amp;gt;&lt;br /&gt;
&amp;lt;square type=”white” correct=”a” current=”” guessed=”” /&amp;gt;&lt;br /&gt;
&amp;lt;square type=”black” /&amp;gt;&lt;br /&gt;
&amp;lt;square type=”white” correct=”o” current=”” guessed=”” /&amp;gt;&lt;br /&gt;
&amp;lt;square type=”white” number=”3” direction=”across” acrossclue=”Crazily annoyed” correct=”m” current=”” guessed=”” /&amp;gt;&lt;br /&gt;
&amp;lt;square type=”white” correct=”a” current=”” guessed=”” /&amp;gt;&lt;br /&gt;
&amp;lt;square type=”white” correct=”d” current=”” guessed=”” /&amp;gt;&lt;br /&gt;
&amp;lt;/grid&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
Сохранив этот код в файле crossword.xml, мы можем использовать следующий PHP-код для печати всех правильных ответов:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
$crossword = simplexml_load_file(&amp;quot;crossword.xml&amp;quot;);&lt;br /&gt;
$i = 0; // square counter&lt;br /&gt;
foreach($crossword-&amp;gt;square as $square) {&lt;br /&gt;
if ($square[&amp;quot;type&amp;quot;] == &amp;quot;white&amp;quot;) {&lt;br /&gt;
print $square[&amp;quot;correct&amp;quot;];&lt;br /&gt;
} else {&lt;br /&gt;
print &amp;quot; &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
++$i;&lt;br /&gt;
if ($i % $crossword['size'] == 0) print &amp;quot;\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
Вложенный в цикл второй оператор if отвечает за правильную расстановку символов перевода строки. Элементы XML загружаются в&lt;br /&gt;
порядке очереди, так что нам нужно прервать строку после символа&lt;br /&gt;
номер $crossword[“size”] или любого, кратного ему.&lt;br /&gt;
&lt;br /&gt;
И это всё? Да, нашей целью было только отображение кроссворда,&lt;br /&gt;
а не программа для их решения или генерации (подсказка – для этого&lt;br /&gt;
можно воспользоваться одним из множества бесплатных словарей в&lt;br /&gt;
web), и у нас нет красивого графического интерфейса пользователя. я&lt;br /&gt;
оставляю первые две задачи на ваше усмотрение, а вот с третьей постараюсь вам помочь в следующем выпуске.&lt;br /&gt;
&lt;br /&gt;
До встречи!&lt;/div&gt;</description>
			<pubDate>Sat, 06 Dec 2008 15:23:28 GMT</pubDate>			<dc:creator>Yaleks</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF71:PHP</comments>		</item>
	</channel>
</rss>