Имеется каталог товаров в xml файле. Необходимо выбрать и вывести все пары товаров сумма которых равна заданому значению. Ниже код и структура xml файла. Если вводишь сумму товаров 10 и более скрипт не работает, не могу понять почему. И с фильтром на повторные пары пока придумал лишь цикл с проверкой на пары ид, но это мне кажется не самый оптимальный вариант. Плюс если с аяксом никогда не работал, сложно будет разобраться как вывести результаты без презагрузки страницы? PHP: <?php class catalog{ const DB_NAME = "test.db"; const CAT_NAME = "file.xml"; function xml2db(){ $db = new SQLite3(self::DB_NAME); $db->exec('CREATE TABLE catalog (id INTEGER PRIMARY KEY AUTOINCREMENT, title STRING, price INTEGER, description STRING)'); $xml = simplexml_load_file(self::CAT_NAME); foreach ($xml as $item) { $db->exec("INSERT INTO catalog (title, price, description) VALUES ('$item->title', $item->price ,'$item->description')"); } $db->close(); } function filter($data){ $db = new SQLite3(self::DB_NAME); $i = 1; do{ $results = $db->query("SELECT id, title, price, description FROM catalog WHERE id=$i"); if($row = $results->fetchArray(1) and $row["price"] < $data){ $results = $db->query("SELECT id, title, price, description FROM catalog WHERE price=($data-{$row["price"]})"); while (($rowD = $results->fetchArray(1))){ $array[] = $row; $array[] = $rowD; } } ++$i; }while($row = $results->fetchArray(1)); $db->close(); unlink(self::DB_NAME); return $array; } } ?> PHP: <?php include "test.php"; ?> <form action="<?=$_SERVER["PHP_SELF"]?>" method="post"> <input type="text" name="Data"> <input type="submit" value="Go"> </form> <?php catalog::xml2db(); $a = catalog::filter($_POST["Data"]); $i = 1; foreach($a as $a1){ foreach($a1 as $val){ echo "<b>$val</b> "; } if(fmod($i,2)) echo " ... "; else echo "<br>"; ++$i; } ?> HTML: <?xml version="1.0"?> <!DOCTYPE products [ <!ELEMENT products (product)+> <!ELEMENT product (title, price, description)?> <!ELEMENT title (#PCDATA) > <!ELEMENT price (#PCDATA) > <!ELEMENT description (#PCDATA) > ] > <products> <product> <title>Phone</title> <price>1</price> <description>Good product</description> </product> <product> <title>Beer</title> <price>2</price> <description>Good product</description> </product> <product> <title>book</title> <price>3</price> <description>Good product</description> </product> <product> <title>pencil</title> <price>4</price> <description>Good product</description> </product> <product> <title>clock</title> <price>5</price> <description>Good product</description> </product> <product> <title>iPod</title> <price>6</price> <description>Good product</description> </product> <product> <title>iPad</title> <price>7</price> <description>Good product</description> </product> <product> <title>notebook</title> <price>8</price> <description>Good product</description> </product> </products>
Разность между заданой суммой покупки и ценой текущего товара. PHP: $data-$row["price"] Выбираем из базы все записи у которых цена равна разности. Ну скажем есть N чисел, вводим число K. Нужно вывести все пары чисел из множества N, сумма которых равна K.
Значение разницы и будут те числа которые нужно вытащить из базы. N{1 2 3 4} K=5 1. N.1=1, K-N1=5-1=4, SELECT... // return N4=4 2. N.2=2, K-N2=5-2=3, SELECT...// return N3=3 3. N.3=3, K-N3=5-3=2, SELECT...// return N2=2 4. N.4=4, K-N4=5-4=1, SELECT...// return N1=1 echo // N1-N4 | N2-N3 | N3-N2 | N4-N1 Видно что 3 и 4 итерации выдадут повторы пар, которые нужно исключить. Обьяснил самым подробнейшим образом, если и сейчас непонятно, тему можно закрыть...
Если я правильно понял задачу, то, наверно, так: PHP: <pre> <?php $summ = 7; // В этом массиве могут быть соответствия между id товара // и его ценой (id => price), полученные из б.д. $arr1 = array( 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7 ); $arr2 = $arr1; $results = array(); foreach($arr1 as $id1 => $price1) { foreach($arr2 as $id2 => $price2) { if(($price1 + $price2 ) == $summ) $results[] = array($id1, $id2); } // Мы сравнили текущий элемент массива $arr1 со всеми значениями // массива $arr2. Массивы одинаковы. Чтобы избежать повторов, а // также не заствалять php выполнять ненужные нам итерации цикла // удалим соответствующий элемент из второго массива (из первого // удаление бесполезно, так как он ещё перебирается, а вот второй // будет перебран сначала) reset($arr2); unset($arr2[(key($arr2))]); } // Здесь искомые данные: каждый элемент массива $results является // массивом, который содержит два значения. Это два ID товаров, // сумма цен которых равна заданному $summ print_r($results); ?> </pre> Может у этой задачи есть и более изящное и правильное решение, не знаю даже. Чё-то на ум только такое сейчас пришло. Но я ещё не ложился и пол ночи пьянствовал.
Решил задачу следующим образом. Еще есть необходимость вывести результат без перезагрузки страницы. Почитал в инете, понял что это делается с помощью AJAX, но с ним никогда не сталкивался, да и Javascript не знаю. Если это не сложно, может кто нибудь обьяснит как сделать, если нет полезу разбираться, время поджимает, нужно закончить как можно быстрее. PHP: <?php class catalog{ const DB_NAME = "test.db"; const CAT_NAME = "file.xml"; function xml2db(){ $db = new SQLite3(self::DB_NAME); $db->exec('CREATE TABLE catalog (id INTEGER PRIMARY KEY AUTOINCREMENT, title STRING, price INTEGER, description STRING)'); $xml = simplexml_load_file(self::CAT_NAME); foreach ($xml as $item) { $db->exec("INSERT INTO catalog (title, price, description) VALUES ('$item->title', $item->price ,'$item->description')"); } $db->close(); } function filter($data){ $data = strip_tags(trim($data)); $db = new SQLite3(self::DB_NAME); $results = $db->query("SELECT catA.*, catB.* FROM catalog catA, catalog catB WHERE catA.price + catB.price = $data and catA.id < catB.id"); $i = 0; while ($row = $results->fetchArray(2)){ $array[] = $row; ++$i; } $db->close(); unlink(self::DB_NAME); if($i == 0) return 0; else return $array; } } ?> PHP: <?php include "test.php"; ?> <form method="POST" action="<?=$_SERVER["PHP_SELF"]?>"> Введите сумму: <input type="text" name="Data"> <input type="submit" value="Искать"> </form> <?php if($_SERVER["REQUEST_METHOD"]=="POST"){ catalog::xml2db(); $result = catalog::filter($_POST["Data"]); if($result == 0) echo "<h3>Нет подходящих товаров!</h3>"; else foreach($result as $val) echo "$val[1] $val[2] $val[3] <b>AND</b> $val[5] $val[6] $val[7]<br>"; } ?>
Сделай по-классически, без аякса. Лучше хорошая реализация, чем кривая но модная. Потом переделаешь на аякс. А вобще см примеры jquery ajax и json.
Насчет аякса: используй iframe. Тут все хорошо описано: http://biznesguide.ru/coding/126.html чуть скрипт переделаешь и все будет ок.