PageRenderTime 51ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/code-snippets/html-ul-objects.php

https://github.com/pritaeas/hp-php
PHP | 141 lines | 113 code | 27 blank | 1 comment | 28 complexity | 1bfa5687d97897c3ff1dba340a0d4857 MD5 | raw file
  1. <?php
  2. class MenuItem
  3. {
  4. public $Id = NULL;
  5. public $Parent = NULL;
  6. public $Name = '';
  7. public $Children = array ();
  8. }
  9. $html = <<<EOT
  10. <ul>
  11. <li>menu 1</li>
  12. <li>menu 2<ul>
  13. <li>menu 2.1<ul>
  14. <li>menu 2.1.1</li>
  15. <li>menu 2.1.2</li>
  16. <li>menu 2.1.3</li></ul></li>
  17. <li>menu 2.2</li>
  18. <li>menu 2.3</li></ul></li>
  19. <li>menu 3</li>
  20. </ul>
  21. EOT;
  22. function find_ul_or_li($source)
  23. {
  24. $result = false;
  25. $pos_ul = strpos($source, '<ul>');
  26. $pos_li = strpos($source, '<li>');
  27. $pos_cul = strpos($source, '</ul>');
  28. $pos_cli = strpos($source, '</li>');
  29. if ($pos_ul === false)
  30. $pos_ul = PHP_INT_MAX;
  31. if ($pos_li === false)
  32. $pos_li = PHP_INT_MAX;
  33. if ($pos_cul === false)
  34. $pos_cul = PHP_INT_MAX;
  35. if ($pos_cli === false)
  36. $pos_cli = PHP_INT_MAX;
  37. if ($pos_ul < min($pos_li, $pos_cul, $pos_cli))
  38. $result = array ('token' => 'ul', 'pos' => $pos_ul);
  39. else if ($pos_li < min($pos_ul, $pos_cul, $pos_cli))
  40. $result = array ('token' => 'li', 'pos' => $pos_li);
  41. else if ($pos_cul < min($pos_ul, $pos_li, $pos_cli))
  42. $result = array ('token' => 'cul', 'pos' => $pos_cul);
  43. else if ($pos_cli < min($pos_ul, $pos_li, $pos_cul))
  44. $result = array ('token' => 'cli', 'pos' => $pos_cli);
  45. return $result;
  46. }
  47. function ul_to_objects($source)
  48. {
  49. $menu = new MenuItem();
  50. $menu->Name = 'root';
  51. $tableInfo = array ();
  52. $currentItem = $menu;
  53. $currentId = 1;
  54. $done = false;
  55. $previous_token = '';
  56. while (!$done)
  57. {
  58. $pos_result = find_ul_or_li($source);
  59. if (!$pos_result)
  60. {
  61. $done = true;
  62. continue;
  63. }
  64. if ($pos_result['token'] == 'ul')
  65. {
  66. if ($previous_token == 'li')
  67. {
  68. $value = substr($source, 0, $pos_result['pos']);
  69. $newItem = new MenuItem();
  70. $newItem->Id = $currentId;
  71. $newItem->Name = $value;
  72. $newItem->Parent = $currentItem;
  73. $tableInfo[] = array ('id' => $currentId, 'parent' => $currentItem->Id, 'content' => $value);
  74. $currentItem->Children[] = $newItem;
  75. $currentItem = $newItem;
  76. $currentId++;
  77. }
  78. $source = substr($source, $pos_result['pos'] + 4);
  79. $previous_token = 'ul';
  80. }
  81. else if ($pos_result['token'] == 'li')
  82. {
  83. $source = substr($source, $pos_result['pos'] + 4);
  84. $previous_token = 'li';
  85. }
  86. else if ($pos_result['token'] == 'cul')
  87. {
  88. $currentItem = $currentItem->Parent;
  89. $source = substr($source, $pos_result['pos'] + 5);
  90. $previous_token = 'cul';
  91. }
  92. else if ($pos_result['token'] == 'cli')
  93. {
  94. $value = substr($source, 0, $pos_result['pos']);
  95. if ($value != '')
  96. {
  97. $newItem = new MenuItem();
  98. $newItem->Id = $currentId;
  99. $newItem->Name = $value;
  100. $newItem->Parent = $currentItem;
  101. $tableInfo[] = array ('id' => $currentId, 'parent' => $currentItem->Id, 'content' => $value);
  102. $currentItem->Children[] = $newItem;
  103. $currentId++;
  104. }
  105. $source = substr($source, $pos_result['pos'] + 5);
  106. $previous_token = 'cli';
  107. }
  108. }
  109. //return $menu;
  110. return $tableInfo;
  111. }
  112. $menu = ul_to_objects($html);
  113. print_r($menu);
  114. ?>