2016-07-08 7 views
0

Всякий раз, когда я запускаю этот код, я получаю:Может вызвать функцию дважды?

PHP Fatal error: Cannot redeclare compare_distance()

Временное решение, как представляется, в том, чтобы дублировать findNearestLocation() и дать ему другое имя, так что вместо вызова findNearestLocation() дважды я называю findNearestLocation1() и findNearestLocation2().

Я попытался отключить переменные в цикле foreach, но я не могу понять, что мне не хватает.

+1

Не могли бы вы добавить ошибку, которую вы получаете на свой вопрос, пожалуйста? – Pete

+1

Это не очевидно из вашего описания, о чем вы говорите. (Вы не можете, например, * определить * функцию дважды.) Вы можете, конечно, * называть * столько раз, сколько хотите. –

+0

@PietervandenHam - я получаю ошибку 500 через ajax на консоли –

ответ

2

Конечно, человек)

Изменение:

function findNearestLocation($clientLocation) { 

    global $depotLocations; 
    $findDepot = $depotLocations; 
    $count = 0; 

    foreach ($findDepot as $row) { 

     $currentDepot = array($row['location_latitude'], $row['location_longitude']); 
     $findDepot[$count]['distance'] = distance($currentDepot,$clientLocation); 
     $count ++; 

    }  

    function compare_distance($a, $b) { 
     if ($a['distance'] == $b['distance']) return 0; 
     return ($a['distance'] < $b['distance']) ? -1 : 1; 
    } 

    usort($findDepot, 'compare_distance'); 

    return $findDepot[0]; 

} 

To:

function compare_distance($a, $b) { 
    if ($a['distance'] == $b['distance']) return 0; 
    return ($a['distance'] < $b['distance']) ? -1 : 1; 
} 

function findNearestLocation($clientLocation) { 

    global $depotLocations; 
    $findDepot = $depotLocations; 
    $count = 0; 

    foreach ($findDepot as $row) { 

     $currentDepot = array($row['location_latitude'], $row['location_longitude']); 
     $findDepot[$count]['distance'] = distance($currentDepot,$clientLocation); 
     $count ++; 

    }  

    usort($findDepot, compare_distance); 

    return $findDepot[0]; 

} 

Или (если вы используете PHP7) :

function findNearestLocation($clientLocation) { 

    global $depotLocations; 
    $findDepot = $depotLocations; 
    $count = 0; 

    foreach ($findDepot as $row) { 

     $currentDepot = array($row['location_latitude'], $row['location_longitude']); 
     $findDepot[$count]['distance'] = distance($currentDepot,$clientLocation); 
     $count ++; 

    }  

    usort(
     $findDepot, 
     function ($a, $b) {return $a['distance'] <=> $b['distance'];} 
    ); 

    return $findDepot[0]; 

} 

Удачи вам!

+0

Большое спасибо! Я не использую PHP7, но это намного более элегантный способ сделать это. :) –

+0

Без проблем, позаботьтесь) –

0

Оказывается, относительно простое решение заключалось в том, чтобы не объявлять функцию внутри функции. Как только я переместил compare_distance() за пределы функции findNearestLocation(), она отлично работает.

Итак, теперь я понимаю, что, но я действительно не понимаю, почему. В чем проблема, возникающая при объявлении функции внутри функции?

Извините, если это кажется очевидной проблемой, я до сих пор новичок в PHP.

<?php 


function findNearestLocation($clientLocation) { 

global $depotLocations; 
$findDepot = $depotLocations; 
$count = 0; 

    foreach ($findDepot as $row) { 

     $currentDepot = array($row['location_latitude'], $row['location_longitude']); 
     $findDepot[$count]['distance'] = distance($currentDepot,$clientLocation); 
     $count ++; 

    }  

    function compare_distance($a, $b) { 
     if ($a['distance'] == $b['distance']) return 0; 
     return ($a['distance'] < $b['distance']) ? -1 : 1; 
    } 

usort($findDepot, 'compare_distance1'); 

return $findDepot[0]; 

} 

function distance($depot, $clientLocation) { // need to send two arrays with only longitude and latitude 

list($lat1, $lon1) = $depot; 
list($lat2, $lon2) = $clientLocation; 

$theta = $lon1 - $lon2; 
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); 
$dist = acos($dist); 
$dist = rad2deg($dist); 
$kilometres = $dist * 60 * 1.1515 * 1.609344; 

return $kilometres; 
} 

// 4. ** These next two lines cause the error. If I comment out either of these lines, the code works fine and returns the expected result. 

$finalPickup = findNearestLocation($pickupLocation); 
$finalDropoff = findNearestLocation($dropoffLocation); 

var_dump($finalPickup); 
var_dump($finalDropoff); 
?> 

Источник: @John Detlefs

+0

Вы можете вызывать любую функцию много раз, но вы можете объявить ее только один раз. Когда в объявлении findNearestLocation было указано выражение compare_distance, каждый раз, когда вы вызываете findNearestLocation, PHP пытается снова объявить compare_distance. –

0

Мое общее понимание языка PHP: хорошо, (shrug),, что он никогда не был таким сложным. Он действительно не знает о «Вложенные функции». Он действительно имеет только две области для переменных. И так далее.

(Но опять же, ее дизайнеры никогда не изложенных создать «самый популярный язык веб-программирования в мире!» Так он идет ...)

Начальное сообщение компилятора об ошибке: cannot re-declare {foobar}, был вашим первым признаком того, что язык не «задирал» то, что вы пытались сделать.

Смежные вопросы