Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: DOMelement to string и сортировка
Форумы портала PHP.SU » » Вопросы новичков » DOMelement to string и сортировка

Страниц (1): [1]
 

1. xsh - 02 Декабря, 2017 - 11:58:45 - перейти к сообщению
Учусь парсить через DOM столкнулся с проблемой того что domelement не string и дальнейшей сортировкой. Просьба помочь.

PHP:
скопировать код в буфер обмена
  1.  
  2. $dom = new DomDocument;
  3. $dom->loadHTMLFile("http://site.com");
  4. $xpath = new DomXPath($dom);
  5.  
  6. $nodes3 = $xpath->query("//table/tbody/tr/td[3]"); // имена
  7. $nodes5 = $xpath->query("//table/tbody/tr/td[5]"); // числа
  8.  
  9. header('Content-Type: text/html; charset=utf-8');
  10.  
  11. foreach ($nodes3 as $i => $node3) {
  12.         if ($i>=1) {
  13.         echo $dom->saveHTML($node3), "<br />"; //с тегом td
  14. //    echo $node3->nodeValue, "\n";
  15.         }
  16. }
  17. foreach ($nodes5 as $i => $node5) {
  18.         if ($i>=1) {
  19.         echo $dom->saveHTML($node5), "<br />"; //с тегом td
  20. //    echo $node5->nodeValue, "\n";
  21.         }
  22. }


первый массив: Саша, Петя, Коля;
второй массив: 1, 5, 3;
они одинаковой длины, хочу добиться того чтобы получился такой вывод:
первый массив: Петя, Коля, Саша;
второй: 5, 3, 1; // по убыванию
Спасибо за любую помощь.
2. armancho7777777 - 02 Декабря, 2017 - 19:35:08 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $getCeilValue = function(DOMElement $row, $ceilIndex) use ($xpath) {
  2.     $ceil = $xpath->query("./td[{$ceilIndex}]", $row);
  3.     return $ceil->length ? trim($ceil[0]->nodeValue) : null;
  4. };
  5.  
  6. $rows = [];
  7.  
  8. foreach($xpath->query("//table/tbody/tr") as $row)
  9. {
  10.     $rows[] = [
  11.         'name' => $getCeilValue($row, 3),
  12.         'num'  => $getCeilValue($row, 5),
  13.     ];
  14. }
  15.  
  16. usort($rows, function($row1, $row2) {
  17.     return $row2['num'] - $row1['num'];
  18. });
  19.  
  20. var_dump($rows);
3. xsh - 02 Декабря, 2017 - 22:24:31 - перейти к сообщению
armancho7777777пойду пробовать и разбираться, а пока скажу: "Спасибо!"
4. xsh - 03 Декабря, 2017 - 12:01:41 - перейти к сообщению
armancho7777777, у меня php 5.4, как быть в таком случае?
вот что получаю
Fatal error: Cannot use object of type DOMNodeList as array
и инете нашел вот что:
In prior versions you'll need to use DOMNodeList's item() method to access a specific index, e.g. $cells->item(0).
https://stackoverflow[dot]com/questi[dot][dot][dot]odelist-as-array
5. armancho7777777 - 03 Декабря, 2017 - 20:52:11 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $getCeilValue = function(DOMElement $row, $ceilIndex) use ($xpath) {
  2.     $ceil = $xpath->query("./td[{$ceilIndex}]", $row);
  3.     return $ceil->length ? trim($ceil->item(0)->nodeValue) : null;
  4. };

(Добавление)
А лучше - обновите PHP.
6. xsh - 04 Декабря, 2017 - 08:53:54 - перейти к сообщению
armancho7777777, я пробовал обновлять, но в таком случае тот сайт на котором я тренируюсь, не отдает DOM, обнаружил это на Вашем скрипте, это очень странно, поскольку на 5.4 дает парсить. пока не понял как это возможно. по мне так либо дает, либо нет.

 

Powered by ExBB FM 1.0 RC1