За последние 24 часа нас посетили 16375 программистов и 1677 роботов. Сейчас ищут 899 программистов ...

Сортировка из нескольких переменных

Тема в разделе "Прочие вопросы по PHP", создана пользователем Ruskat, 1 сен 2013.

  1. Ruskat

    Ruskat Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    29
    Симпатии:
    0
    Не могу нигде найти примера, как вывести даные из трёх переменных...
    ситуация такова: Имеются три переменные: $deg_max[1], $deg_min[1] и $date[1]. Они выводят данные:
    $deg_max[1] - 22,18,16,14,17,15,15,21,21,21,22,15,14,17,16,17,21,23,24,24,24,23,19,15,16,17,19,21,23
    $deg_min[1] - 12,14,11,10,11,11,13,13,11,14,11,11,8,9,12,11,10,10,13,12,13,14,14,11,10,11,11,12,12
    $date[1] - '1','3','5','7','9','11','13','15','17','19','21','23','25','27','29'
    Нужно:
    1: К переменной $date[1] добавлять недостающее промежуточное число (это дата). Если 1 и 3, то чтобы между ними было 2, и т д...
    2: Выводить списком по 1 параметру из каждой переменной. Например:
    22 - 12 - 1
    18 - 14 - 2
    16 - 11 - 3 и т д.
    Помогите пожалуйста с решением.
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Задачки преподские? Во фриланс.
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    $a = array(1, 2, 3);
    $b = array('bag', 'bag',' bag');
    print_r(array_combine($a, $b));
     
  4. Ruskat

    Ruskat Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    29
    Симпатии:
    0
    Спасибо, но не совсем то... Твой пример выводит Array ( [1] => bag [2] => bag [3] => bag ), а мне нужно в виде: {"tmax":10,"tmin":"6","day":"7"}.
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
  6. Ruskat

    Ruskat Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    29
    Симпатии:
    0
    Мож еще кто поможет???
    Даные для скрипта должны выводиться так:
    Код (Text):
    1. [{"days":10,"tmin":"-2","tmax":"7"},{"days":11,"tmin":"8","tmax":"14"},{"days":12,"tmin":"2","tmax":"9"}]
    .
    для такого вида используется скрипт:
    Код (Text):
    1. <?php
    2.  
    3. $data = array(
    4.        array(
    5.         'days'=>10,
    6.         'tmin'=>'-2',
    7.         'tmax'=>'7'
    8.     ), array(
    9.         'days'=>11,
    10.         'tmin'=>'8',
    11.         'tmax'=>'14'
    12.     ), array(
    13.         'days'=>12,
    14.         'tmin'=>'2',
    15.         'tmax'=>'9'
    16.     )
    17. );
    18.  
    19. if (isset($_REQUEST['days'])) {
    20.     $days = $_REQUEST['days'];
    21.     foreach ($data as &$customer) {
    22.         if ($customer['days'] == $days) {
    23.             echo json_encode($customer);
    24.             break;
    25.         }
    26.     }
    27. } else {
    28.     echo json_encode($data);
    29. }
    30. ?>
    Нужно только изсенить указанные данные на данные, поступающие из переменных
    Код (Text):
    1. $deg_max[1]; $deg_min[1];$date[1];
    .
     
  7. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    json
    Но хотя еще есть (object), чтобы вызов был объектный, то есть $array->key
     
  8. Ruskat

    Ruskat Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    29
    Симпатии:
    0
    В дате нужно как-то упорядочить данные. получаю вид: '5','7','9','11','13','15','17','19','21','23','25','27','29','1','3', а нужно, чтобы отображалось каждое число: 5,6,7.8,9,10....
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
  10. Ruskat

    Ruskat Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    29
    Симпатии:
    0
    MAN_IFE_ST, дай пожалуйста конкретный пример. относящийся к моей ситуации. Ничего не подошло...
    Это с датой. А с выводом даных из переменных $dg_min и $dg_max я так и не смог поразбивать их на список.
    Мне сначала нужно указать, каким образом резать массив на список. То-есть, чтобы отобразить одно число из массива $dg_min, я использую $dg_min[0], а мне нужно, чтобы это делалось автоматом на основе подсчёта этих $dg_min[Х]. сколько их максимум насчитало, например по $dg_min[15], знач 15 и вывести.
    Вот что мне надо было...
    Код (Text):
    1. $var_max = "22,18,16,14,17,15,15,21,21,21,22,15,14,17,16,17,21,23,24,24,24,23,19,15,16,17,19,21,23";
    2. $var_max = explode(",", $var_max);
    3. $var_min = "12,14,11,10,11,11,13,13,11,14,11,11,8,9,12,11,10,10,13,12,13,14,14,11,10,11,11,12,12";
    4. $var_min = explode(",", $var_min);
    5. $var_date = "'1','3','5','7','9','11','13','15','17','19','21','23','25','27','29'";
    6. $var_date = explode(",", $var_date);
    7. echo "<br>";
    8.  for ($i=0; $i<count($var_max), $i<count($var_min), $i<count($var_date); $i++) {
    9.       echo "<li> $i =".$var_max[$i]." - ".$var_min[$i]." - ".$var_date[$i];
    10.    }
    Остаётся тока подумать, как в переменной
    Код (Text):
    1. $var_date = "'1','3','5','7','9','11','13','15','17','19','21','23','25','27','29'";
    промежуточные числа вставлять..
    -------------------------------------------------
    Получаю массив: [{"days":0,"tmin":"10","tmax":"22"},{"days":1,"tmin":"10","tmax":"19"},{"days":2,"tmin":"11","tmax":"20"},{"days":3,"tmin":"14","tmax":"17"},{"days":4,"tmin":"13","tmax":"16"},{"days":5,"tmin":"12","tmax":"14"},{"days":6,"tmin":"12","tmax":"13"},{"days":7,"tmin":"11","tmax":"17"},{"days":8,"tmin":"10","tmax":"19"},{"days":9,"tmin":"9","tmax":"14"},{"days":10,"tmin":"8","tmax":"14"},{"days":11,"tmin":"6","tmax":"14"},{"days":12,"tmin":"12","tmax":"19"},{"days":13,"tmin":"14","tmax":"15"},{"days":14,"tmin":"15","tmax":"18"},{"days":15,"tmin":"12","tmax":"14"},{"days":16,"tmin":"9","tmax":"14"},{"days":17,"tmin":"8","tmax":"13"},{"days":18,"tmin":"5","tmax":"14"},{"days":19,"tmin":"5","tmax":"11"},{"days":20,"tmin":"5","tmax":"12"},{"days":21,"tmin":"5","tmax":"14"},{"days":22,"tmin":"10","tmax":"13"},{"days":23,"tmin":"10","tmax":"14"},{"days":24,"tmin":"10","tmax":"14"},{"days":25,"tmin":"10","tmax":"14"},{"days":26,"tmin":"9","tmax":"13"},{"days":27,"tmin":"9","tmax":"14"},], но проблемка есть... Как последнюю запятую удалить???
    Обработчик:
    Код (Text):
    1. echo "[";
    2.  for ($comma=',', $i=0; $i<count($dg_min), $i<count($dg_max); $i++) {
    3.       echo "{\"days\":$i,\"tmin\":\"".$dg_min[$i]."\",\"tmax\":\"".$dg_max[$i]."\"}".$comma;
    4.    }
    5. echo "]";
    $comma - єто запятая, загнанная в переменную, чтобы чего с ней сделать, но пока не могу ничего придумать...
     
  11. Ruskat

    Ruskat Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    29
    Симпатии:
    0
    то ли все уснули, то ли заняты... результат получился...
    Код (Text):
    1. <?php
    2. //Запитуємо та вводимо дані
    3. /**/
    4. $ch = curl_init();
    5. curl_setopt($ch, CURLOPT_URL, 'http://www.gismeteo.ua/ua/month/4953/');
    6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    7. curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    8. $get_data = curl_exec($ch);
    9.                     //                  Діаграма на місяць
    10.                     $rs2 = explode('<div class="rframe" id="graph"><div class="fcontent">',$get_data);
    11.                     $get_data = $rs2[1] ;
    12.                     $rs2 = explode('</div></div>',$get_data);
    13.                     $diagram = $rs2[0];  //Обробка
    14.                     //Максимальна температура
    15. preg_match("!c:\[(.*?)\],!si", $diagram, $deg_max);
    16. $dg_max = explode(",", $deg_max[1]);
    17.                     //Мінімальна температура
    18. preg_match("!cmin:\[(.*?)\],!si", $diagram, $deg_min);
    19. $dg_min = explode(",", $deg_min[1]);
    20. preg_match("!x:\[(.*?)\],!si", $diagram, $date);
    21.                     //Дата
    22. $dat = explode("'", $date[1]);
    23. $dat = str_replace(',', '', $dat);
    24. $dat = str_replace('\'', '', $dat);
    25.                     //                  Профільтрували дані //
    26. $datas = array($dg_min, $dg_max);
    27. $comma=',';
    28.     echo "[";
    29.         for ($i=0, $j=0; $i<count($datas[0]), $j<count($datas[1]); $i++, $j++){
    30.         //if ($i = count($datas[0]) -1 and $j = count($datas[1]) -1)  $comma = null;
    31.         $res = "{\"days\":$i,\"tmin\":\"".$datas[0][$i]."\",\"tmax\":\"".$datas[1][$j]."\"}".$comma;
    32.         $resultat = $resultat.$res;
    33.         }
    34.         $y = strlen($resultat);
    35.         $r = substr ($resultat, 0, $y-1);
    36.         echo $r;
    37.     echo "]";
    38. ?>
    Но... На ксампе нормально работает, а на серваке вин7 дома не хочет - выдает ошибку.. На ксампе PHP 5.1.6.
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Возможно, на серваке на вин7 не установлен curl?
    Как правило, можно обойтись и без него. Получить нужные данные можно и с помощью file_get_contents(). Он тоже умеет делать как GET, так и POST запросы, отправлять в запросе произвольные заголовки. В руководстве по php расписано (и есть примеры) как этим пользоваться.

    Добавлено спустя 20 минут 9 секунд:
    Касаемо твоей изначальной задачи, которая в первом сообщении этой темы. У тебя там в первых двух списках одинаковое количество элементов - для каждого дня свой элемент. А в третьем списке - там идут сами дни, но часть из них - пропущена. Однако указан первый и последний день, которые должны присутствовать в этом списке. Как я понял из текста задачи - тебе нужно пересоздать этот список так, чтобы в нём присутствовали все дни, а не выборочно. Сделать это не сложно. Я напишу тебе пример, но не на 100% по твоему коду, тем не менее, думаю, ты поймёшь, что можешь сделать. Допустим, в переменной $dates хранится в виде текстовой строки даты, среди которых есть первая и последняя (считай, что это твоё $date[1]). Тогда перезаполнить можно так:
    Код (PHP):
    1. $dates = "'1','3','5','7','9','11','13','15','17','19','21','23','25','27','29'";
    2. $dates = explode(',', $dates);   // из строки создаём массив
    3. $first = (int) trim(array_shift($dates), " '");   // получаем первый элемент - он же первый день для этого списка
    4. $last = (int) trim(array_pop($dates), " '");   // получаем последний элемент - он же последний день для этого списка
    5. $dates = range($first, $last);   // создаём новый массив, в котором будут присутствовать все дни от первого до последнего