Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Объединить два кода (https://javascript.ru/forum/server/70173-obedinit-dva-koda.html)

Sonya 16.08.2017 22:11

Объединить два кода
 
Здравствуйте! Подскажите, пожалуйста, как можно объединить два кода. Есть код, который переформатирует дату рождения а нужный формат:
<?php
$date = "29.4.1993";
echo date("d,m", strtotime($date));
?>

и код определяющий знак зодиака по дате рождения:
<?php
function getZodiacalSign($day, $month){
$signs = array("Козерог","Водолей","Рыбы","Овен","Телец","Близнецы","Рак","Лев","Девы","Весы","Скорпион","Стрелец");
$signsstart = array(1=>21,2=>20,3=>20,4=>20,5=>20,6=>20,7=>21,8=>22,9=>23,10=>23,11=>23,12=>23);
return $day < $signsstart[$month +1]? $signs[$month -1]: $signs[$month %12];}
echo getZodiacalSign(29,4);
?>

Как подставить в
echo getZodiacalSign(29,4);
из первого кода, переформатированную дату во второй?

laimas 17.08.2017 03:19

function getZodiacalSign($date){
    if($date = strtotime($date)) {
        list($day, $month) = explode('.', date('d.m', $date));
        $signs = ["Козерог","Водолей","Рыбы","Овен","Телец","Близнецы","Рак","Лев","Девы","Весы","Скорпион","Стрелец"];
        $signsstart = [21, 20, 20, 20, 20, 20, 21, 22, 23, 23, 23, 23];
        return $day < $signsstart[$month +1]? $signs[$month -1]: $signs[$month %12];
    }
}
echo getZodiacalSign('29.4.1993');

laimas 17.08.2017 03:26

function getZodiacalSign($date){
    $date = date_parse($date);
    if(!$date['errors']) {
        $signs = ["Козерог","Водолей","Рыбы","Овен","Телец","Близнецы","Рак","Лев","Девы","Весы","Скорпион","Стрелец"];
        $signsstart = [21, 20, 20, 20, 20, 20, 21, 22, 23, 23, 23, 23];
        return $date['day'] < $signsstart[$date['month'] +1]? $signs[$date['month'] -1]: $signs[$date['month'] %12];
    }
}

echo getZodiacalSign('29.4.1993');

Sonya 17.08.2017 09:51

Большое спасибо! Оба варианта прекрасно работают.

laimas 17.08.2017 10:19

Второй и использовать, только добавить действие если дата некорректная.

Sonya 17.08.2017 11:58

Спасибо, но что-то мой код неправильно считает с 11 по 1 месяц, остальные все правильно.

laimas 17.08.2017 12:41

Забыл указать массиву начинать индекс с 1, должно быть так:

$signsstart = [1=>21, 20, 20, 20, 20, 20, 21, 22, 23, 23, 23, 23];


Если при этом все равно будет неверное определение, то данный подход некорректный. Ошибка значит в датах $signsstart или смещениях.

Я не астролог, понятия не имею какой знак у кого и на каком основании, и до сей поры меня это и не интересовало. Попадалось, что определение его с точностью сложнее, чем данное представление. В сети же много решений этой задачи, включая и на РНР, посмотрите другое, может что-то более корректное есть.

Ну а не получится, посмотрю, что вообще означает 21, 20, 20, 20, 20..., но позже.

Sonya 17.08.2017 12:59

Вот этот корректно считает, но опять формат вывода даты нужен не 29-04-1993, как в коде, а 29.4.1993.
<?php
function znakZodiaka($data){
$day = str_replace("-","",substr($data,5));
$zodiak = array('ot' => array('0120','0219','0321','0421','0521','0622','0723','0823','0923','1024','1123','1222','0101'),
            'do' => array('0218','0320','0420','0520','0621','0722','0822','0922','1023','1122','1221','1231','0119'),
                'zn' => array('Водолей','Рыбы','Овен','Телец','Близнец','Рак','Лев','Дева','Весы','Скорпион','Стрелец','Козерог','Козерог'));
$i = 0;
while (empty($znak) && ($i < 13)){
    $znak = (($zodiak['ot'][$i] <= $day) && ($zodiak['do'][$i] >= $day)) ? $zodiak['zn'][$i] : null;
    ++$i;
} return $znak;
}
echo znakZodiaka("2010-06-18");
?>

Sonya 17.08.2017 13:01

Сейчас сделала, чтобы он эти условиям соответствовал, но опять через переформатирование даты, а сразу без этого переформатирования можно сделать?

Sonya 17.08.2017 13:06

Хотя нет, переформатирование нужно, из-за substr($data,5).


Часовой пояс GMT +3, время: 23:45.