2017-02-10 75 views
0

晚上好球员,使用array_splice导致“未定义偏移”误差

目前正在对一段代码,如果条件满足,将被删除阵列。在使用array_unset尝试之后,我决定使用array_splice不破坏id结构。不幸的是我有同样的问题:

E_NOTICE : type 8 -- Undefined offset: 5 -- at line 59 
E_NOTICE : type 8 -- Undefined offset: 5 -- at line 60 

偏移队伍从5到2

说明:要理解我在做什么在这里,我给一个简短的解释。使用给定的x坐标和y坐标,我的小程序应该遍历数组元素以查找离开始城镇最近的城市。最近的点将成为新的起点,并从城市阵列中移除,因为它已经被访问过。整个过程再次开始,直到城市阵列中没有其他元素。这就像旅行推销员问题。

现在我想解决它,但我不知道如何也不明白这个问题。我读了关于使用array_values,它不起作用。

$cities = array 
    (
    (0) => Array(
     ('city') => 'San Francisco', 
     ('x_cord') => '22', 
     ('y_cord') => '28', 
    ), 
    (1) => Array(
     ('city') => 'Oakland', 
     ('x_cord') => '15', 
     ('y_cord') => '13', 
    ), 
    (2) => Array(
     ('city') => 'Stanford', 
     ('x_cord') => '5', 
     ('y_cord') => '2', 
    ), 
    (3) => Array(
     ('city') => 'Palo Alto', 
     ('x_cord') => '17', 
     ('y_cord') => '15', 
    ), 
    (4) => Array(
     ('city') => 'San Jose', 
     ('x_cord') => '5', 
     ('y_cord') => '2', 
    ), 
    (5) => Array(
     ('city') => 'Marin', 
     ('x_cord') => '22', 
     ('y_cord') => '28', 
    ), 
    (6) => Array(
     ('city') => 'Sacramento', 
     ('x_cord') => '30', 
     ('y_cord') => '40', 
    ) 
);  




$curCit = "San Francisco"; 
$key = array_search('Oakland', array_column($cities, 'city')); 
$curX = $cities[$key]['x_cord']; //3; 
$curY = $cities[$key]['y_cord']; //4; 
$hv = 0; 
$distance = 0; 
$row_city = 0; 

$way = array(); 
$counter = count($cities); 
while ($counter>0) { 

     for ($i = 5; $i >= 0; $i--) { 
      global ${"value_" . $i}; 
      //${"value_" . $i} = $cities[$i][1]+$cities[$i][2]; 
      ${"value_" . $i . "x"} = $curX - $cities[$i]['x_cord']; 
      ${"value_" . $i . "y"} = $curY - $cities[$i]['y_cord']; 
      ${"value_" . $i} = sqrt(${"value_" . $i . "x"}*${"value_" . $i . "x"} + ${"value_" . $i . "y"}*${"value_" . $i . "y"}); 

      if ($hv == 0) { 
       //global $hv; 
       $hv = ${"value_" . $i}; 

      } 
      elseif ($hv > 0) { 



         if (${"value_" . $i}<$hv) { 
         //global $hv; 
         $hv = ${"value_" . $i}; 
         $distance = $distance + $hv; 
         $row_city = $i; 
         $curX = $cities[$i]['x_cord']; //3; 
         $curY = $cities[$i]['y_cord']; //4; 


           $newdata = array (
             'next_city' => $cities[$i]['city'], 
             'nxt_cty_xcord' => $cities[$i]['x_cord'], 
             'nxt_cty_ycord' => $cities[$i]['y_cord'], 
             'distance' => ${"value_" . $i} 
            ); 
          //array_push($way,$newdata); 
     array_push($way,$newdata); 
     array_splice($cities, $i); 
     $cities = array_values($cities); 

         } //end 2nd if-clause 

      echo number_format(${"value_" . $i},2); 
      echo " "; 
      echo "HV "; 
      echo number_format($hv,2); 
      echo "<br>"; 
      $hv = 0; 

     } //end 1st if-clause 
     } //end for-clause 



     $counter--; 
} //end while-loop 
print_r($cities); 
echo "<br>"; 
print_r($way); 

该代码是不完美的,因为我仍然工作。但是从城市多维数组中删除数组元素的问题阻止了我。

任何人都可以提供帮助和建议吗? 如果你喜欢推荐array_values,那么请尝试一下并且可能犯了一个错误。

在此先感谢。

编辑:虽然如果我把array_splice放在我赋值给的变量后面会是一个解决方案。

+0

推荐阅读:http://stackoverflow.com/help/mcve – wogsland

+0

的问题是,你想从$城市的读取元件在行'$ {“value_”处。 $ i。 “x”} = $ curX - $ cities [$ i] ['x_cord'];''$ {“value_”。 $ i。 “y”} = $ curY - $ cities [$ i] ['y_cord'];'目前不存在,因为它与'array_splice($ cities,$ i);'拼接在一起。试着解释你想要达到什么目标,因为必须有比这一堆IF更好的方法...... –

+0

@HonzaRydrych:在帖子中增加了一个额外的解释。如果我需要改进解释,请告诉我。也许它还不够精确。 是的,这是不幸的问题,但认为,如果在脚本从第1行到第xy个“正在运行”时将值赋予变量,则将剪接定位。 wogsland:对不起= ^} – nucky

回答

0

我试图根据您的描述尽可能简化您的代码。如果有什么不清楚的地方,请不要犹豫。我忽略了结果中的'next_city'项,因为它似乎没有必要(由于下一项中的数据相同),但代码可以很容易地更改。

  • 尝试使用可变的变量$ {XY}只有当它是必要的,它的可读性变差,即使你一年或两年:-)
  • 后:

    值得检讨你的代码后提那些事

  • 当你处理具有不明索引的迭代(例如数组)时,使用foreach循环而不是for。从数组中删除项目时,您将不会遇到未定义索引的问题。

最后的代码(没有数组定义):

//for debugging 
//var_dump($cities); 

$startCity = "San Francisco"; 

$nearestCityIndex = array_search($startCity, array_column($cities, 'city')); 
$hv = null; 
$counter = count($cities); 
for($c=0; $c < $counter; $c++) { 
    //add new item to the route plan array 
    $route[] = array_merge(
     $cities[$nearestCityIndex], 
     array('distanceFromPrevious' => $hv) 
    ); 

    //remove already planned city from source array 
    unset($cities[$nearestCityIndex]); 

    //get last one from already planned cities 
    $lastItem = $route[count($route)-1]; 

    $hv = 99999; 
    //loop through remaining cities to get shortest possible distance last planned city 
    foreach($cities as $key => $item) { 
     $tmpDist = sqrt(pow($lastItem['x_cord'] - $item['x_cord'],2) + pow($lastItem['y_cord'] - $item['y_cord'], 2)); 
     if ($hv >= $tmpDist) { 
      $hv = $tmpDist; 
      $nearestCityIndex = $key; 
     } 
    } 
} 

//for debugging 
//echo "<br><br>"; 
//var_dump($route); 
+0

这个答案有用或需要任何解释吗? –

+0

感谢您的回答。理解你的解决方案需要一段时间,但这是一个很好的解决方案,简单而简短。你的代码教会了我很多。 – nucky