PHP返回数组已完成要求

前端之家收集整理的这篇文章主要介绍了PHP返回数组已完成要求前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在这里有一些功能,我正在努力获得正确的输出.

主要思想是使用名为buildinginfo的函数调用函数avaliableBuildingBuildings循环通过buildinginfo的数组并循环通过需求来查明需求是否完整.

在我的数据库中,我的main_building级别为1.

每隔一张桌子都是空的.

调用avaliableBuildingBuildings时,我得到这条线下的输出,这将列出我可以创建的建筑物.你可以看到main_building的要求是3,那么就不应该创建营房.

问:我怎样才能修复我的代码,以便它能真正地给我一些我可以构建的建筑物?

当前输出

  1. array(5) {
  2. ["barracks"]=>
  3. array(2) {
  4. ["max"]=>
  5. int(1)
  6. ["requirements"]=>
  7. array(2) {
  8. ["main_building"]=>
  9. int(3)
  10. ["rally_point"]=>
  11. int(1)
  12. }
  13. }
  14. ["blacksmith"]=>
  15. array(2) {
  16. ["max"]=>
  17. int(1)
  18. ["requirements"]=>
  19. array(3) {
  20. ["main_building"]=>
  21. int(3)
  22. ["academy"]=>
  23. int(3)
  24. ["barracks"]=>
  25. int(3)
  26. }
  27. }
  28. ["embassy"]=>
  29. array(2) {
  30. ["max"]=>
  31. int(1)
  32. ["requirements"]=>
  33. array(1) {
  34. ["main_building"]=>
  35. int(1)
  36. }
  37. }
  38. ["marketplace"]=>
  39. array(2) {
  40. ["max"]=>
  41. int(1)
  42. ["requirements"]=>
  43. array(3) {
  44. ["warehouse"]=>
  45. int(1)
  46. ["granary"]=>
  47. int(1)
  48. ["main_building"]=>
  49. int(3)
  50. }
  51. }
  52. ["palace"]=>
  53. array(2) {
  54. ["max"]=>
  55. int(1)
  56. ["requirements"]=>
  57. array(3) {
  58. ["main_building"]=>
  59. int(5)
  60. ["embassy"]=>
  61. int(1)
  62. ["residence"]=>
  63. int(0)
  64. }
  65. }
  66. }

完整代码

  1. function isBuilt($villageid,$name) {
  2. $buildinginfo = $this->buildinginfo();
  3. $thisBuilding = $buildinginfo[$name];
  4.  
  5. $built = $this->CI->db->query("SELECT * from `$name` where `villageid`='$villageid'")->row();
  6. return ($built ? $built : false);
  7. }
  8.  
  9. function requirementsDone($villageid,$name) {
  10. $buildinginfo = $this->buildinginfo()[$name];
  11. $canbebuilt = true;
  12. if (isset($buildinginfo['requirements'])) {
  13. $requirements = $buildinginfo['requirements'];
  14.  
  15.  
  16. foreach ($requirements as $reqname => $level) {
  17. $building = $this->isBuilt($villageid,$reqname);
  18. if ($building) {
  19. echo "needs that $reqname (".$building->level.")is higher than $level to build $name <br><br>";
  20. if ($building->level >= $level) {
  21. echo "<br> $reqname is acually higher ! <br><br>";
  22.  
  23. } else {
  24. echo " i cant acually build this.. <br><br>";
  25. $canbebuilt = false;
  26. break;
  27. }
  28. } else {
  29. $canbebuilt = false;
  30. break;
  31. }
  32. }
  33. }
  34.  
  35. if ($canbebuilt) {
  36. echo "result to build $name is true<br>";
  37.  
  38. } else {
  39. echo "result to build $name is false<br>";
  40.  
  41. }
  42. return $canbebuilt;
  43. }
  44.  
  45. function existingBuildings($villageid) {
  46.  
  47. $buildinginfo = $this->buildinginfo();
  48. $buildings = array();
  49. foreach($buildinginfo as $name => $array) {
  50. $built = $this->isBuilt($villageid,$name);
  51. if ($built) {
  52. $buildings[$name] = $built;
  53. }
  54.  
  55. }
  56.  
  57. return $buildings;
  58.  
  59. }
  60.  
  61. function avaliableBuildingBuildings($villageid) {
  62. $avaliable = $this->avaliableBuildings($villageid);
  63.  
  64. $tobuild = array();
  65. foreach($avaliable as $name => $built) {
  66.  
  67. if (isset($built['requirements'])) {
  68. $req = $built['requirements'];
  69.  
  70. foreach ($req as $reqname => $level) {
  71. $canbuild = $this->requirementsDone($villageid,$reqname);
  72.  
  73. if ($canbuild) {
  74. echo "verify to build $reqname is true <br><br>";
  75. $tobuild[$name] = $avaliable[$name];
  76.  
  77. } else {
  78. echo "verify to build $reqname is false <br><br>";
  79.  
  80. break;
  81. }
  82. }
  83. } else {
  84.  
  85. }
  86. }
  87. return $tobuild;
  88. }
  89.  
  90. function avaliableBuildings($villageid) {
  91. $buildinginfo = $this->buildinginfo();
  92.  
  93. foreach($this->existingBuildings($villageid) as $name => $built) {
  94. if (array_key_exists($name,$buildinginfo)) {
  95. unset($buildinginfo[$name]);
  96. echo "removing $name <br>";
  97. }
  98. }
  99.  
  100. return $buildinginfo;
  101.  
  102.  
  103.  
  104. }
  105.  
  106. function buildinginfo() {
  107.  
  108. $info = array(
  109. 'academy' => array('max' => 1),'barracks' => array('max' => 1,'requirements' => array(
  110. 'main_building' => 3,'rally_point' => 1,)
  111. ),'main_building' => array('max' => 1,'requirements' => array(
  112. 'main_building' => 1,'greatbarracks' => array('max' => 1),'greatstable' => array('max' => 1),'heromansion' => array('max' => 1),'rally_point' => array('max' => 1),'stable' => array('max' => 1,'requirements' => array(
  113. 'blacksmith' => 3,'academy' => 5,'blacksmith' => array('max' => 1,'requirements' => array(
  114. 'main_building' => 3,'academy' => 3,'barracks' => 3,'forge' => array('max' => 1),'tournament_square' => array('max' => 1),'trapper' => array('max' => 1),'cranny' => array('max' => 1),'embassy' => array('max' => 1,'requirements' => array(
  115. 'main_building' => 1
  116. )
  117. ),'marketplace' => array('max' => 1,'requirements' => array(
  118. 'warehouse' => 1,'granary' => 1,'main_building' => 3
  119. )
  120. ),'palace' => array('max' => 1,'requirements' => array(
  121. 'main_building' => 5,'embassy' => 1,'residence' => 0
  122. )
  123. ),'residence' => array('max' => 1),'town_hall' => array('max' => 1),'trade_office' => array('max' => 1),'treasury' => array('max' => 1),'granary' => array('max' => 99,'new' => 20),'warehouse' => array('max' => 99,'new' => 20)
  124.  
  125. );
  126.  
  127. return $info;

}

看起来你的需求检查循环加倍了.这导致检查是否可以构建任何所需的建筑物(并且它总是可以,因为没有嵌套要求).只是摆脱内循环,它应该没问题.
  1. function avaliableBuildingBuildings($villageid) {
  2. $avaliable = $this->avaliableBuildings($villageid);
  3.  
  4. $tobuild = array();
  5. foreach ($avaliable as $name => $built) {
  6. if (isset($built['requirements'])) {
  7. if ($this->requirementsDone($villageid,$name)) {
  8. echo "verify to build $name is true <br><br>";
  9. $tobuild[$name] = $avaliable[$name];
  10. } else {
  11. echo "verify to build $name is false <br><br>";
  12. }
  13. } else {
  14.  
  15. }
  16. }
  17. return $tobuild;
  18. }

PS.那些“回声”没有帮助,是吗?:)想想TDD – 这个过程解决了更多的问题而不仅仅是逻辑错误(它会迫使你引入假数据层 – 例如>解耦代码)

猜你在找的PHP相关文章