Создание массива в цикле foreach - PullRequest
0 голосов
/ 28 сентября 2019

Обновлен вопрос.Как я могу добавить дополнительный столбец в массиве.Я хочу добавить расстояние до столбца, которое является результатом формулы, которую я создал

Вот мой код

    $db = $this->getDbo();
        $query = $db->getQuery(true)
                ->select('*')
                 ->from('#__listing');
     $db->setQuery($query);
      $db->query();

     $rows = $db->loadRowList();


$arr_data = array();
foreach ($rows as $row) {
    $theta = $longitudeFrom - $row->longitude;
    $dist =   sin(deg2rad($latitudeFrom)) 
            * sin(deg2rad($row>latitude)) 
            + cos(deg2rad($latitudeFrom)) 
            * cos(deg2rad($row->latitude)) 
            * cos(deg2rad($theta));
    $dist = acos($dist);
    $dist = rad2deg($dist);
    $miles = $dist * 60 * 1.1515;
    $distance = $miles * 1.609344;
    $key = $row[0];
    $arr_data[$key] = array('id' => $row[0], 'name' => $row[1]);
}

Это то, что я пробовал

$arr_data = array();
foreach ($rows as $row) {
    $theta = $longitudeFrom - $row->longitude;
    $dist =   sin(deg2rad($latitudeFrom)) 
            * sin(deg2rad($row>latitude)) 
            + cos(deg2rad($latitudeFrom)) 
            * cos(deg2rad($row->latitude)) 
            * cos(deg2rad($theta));
    $dist = acos($dist);
    $dist = rad2deg($dist);
    $miles = $dist * 60 * 1.1515;
    $distance = $miles * 1.609344;

    $key = $row[0];
    $arr_data[$key] = array(
                        'id' => $row[0],
                        'name' => $row[1],
                        'distance' => $distance);
}

1 Ответ

1 голос
/ 28 сентября 2019

Правильно ли я понимаю, что вы хотите получить новый массив, который содержит агрегированные записи для каждой записи из $ строк?Если да, вы можете сделать что-то вроде этого:

$db = $this->getDbo();
$query = $db->getQuery(true)
            ->select('*')
            ->from('#__listing');
$db->setQuery($query);
$db->query();

$rows = $db->loadAssocList();


$arr_data = [];
foreach ($rows as $rowIndex=>$rowData) {
    $theta = $longitudeFrom - $rowData['longitude'];
    $dist =   sin(deg2rad($latitudeFrom)) 
            * sin(deg2rad($rowData['latitude'])) 
            + cos(deg2rad($latitudeFrom)) 
            * cos(deg2rad($rowData['latitude'])) 
            * cos(deg2rad($theta));
    $dist = acos($dist);
    $dist = rad2deg($dist);
    $miles = $dist * 60 * 1.1515;
    $distance = $miles * 1.609344;

    $arr_data[$rowIndex] = [
        'id' => $rowData['id'],
        'name' => $rowData['name'],
        'distance' => $distance
    ];
}

PS: Я использую сокращенную запись массива [], но она равна array()

PPS: также существует проблема в исходном коде с обработкой переменной $row как объекта $row->longitude, а не как массива $row[1].Какой из них правильный, зависит от того, как вы получите $rows, но все равно не следует его смешивать.

PPPS: согласно комментарию ниже, я обновил свой ответ, используя loadAssocList, чтобы получить ассоциативный массиви изменил

'id' => $rowData[0],
'name' => $rowData[1],

на

'id' => $rowData['id'],
'name' => $rowData['name'],

Предполагая, что ваши поля 'id' и 'name' названы соответственно в БД.

...