[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разница значений
Страницы: 1, 2
Bezdna
В очередной раз запнулся об простейшую, вроде бы, задачу: имеется массив отортированных числовых значений, допустим "80, 73, 65, 56, 33, 14, 2". Нужно получить разницу следующих друг за другом значений, т.е., соответственно "7(80-73), 8(73-65), 9(65-56), 22(56-33), 19(33-14), 12(14-2)". Пока кроме многоэтажного кода с кучей циклов у меня не получается. Есть какое-нибудь элегантное решение? Буду благодарен за любой пинок в нужном направлении.
sg.com
Это не код, набросок, но может сработает



$data = array(80, 73, 65, 56, 33, 14, 2);

foreach($data as $key=>$val)
{
$over = $val;
$under = $data[$key+1];

$diff[$key] = $over - $under;
}

$result = array_shift($diff);

FatCat
Я бы сделал так:
$data = array(80, 73, 65, 56, 33, 14, 2);
$diff = array();
$tmp = 0;
foreach($data as $val)
{
if($tmp)$diff[] = $tmp - $val;
$tmp = $val;
}


_____________
Бесплатному сыру в дырки не заглядывают...
Valick
Bezdna, надо начать с того, что сама задача несколько странная wink.gif

_____________
Стимулятор ~yoomoney - 41001303250491
Valick

<?php
$data = [80, 73, 65, 56, 33, 14, 2];

$diff = array_map(
function ($arr) {
return array_shift($arr) - array_shift($arr);
},
array_chunk($data, 2)
);


print_r($diff);


упс, не так понял задачу))

_____________
Стимулятор ~yoomoney - 41001303250491
twin
Ну или как то так, попрозрачнее:
    $data = [80, 73, 65, 56, 33, 14, 2];
$diff = [];

$current = $data[0];
while($next = next($data)){
$diff[] = $current - $next;
$current = $next;
}

print_r($diff);


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Valick
Николай, немного подрихтовал твой вариант

<?php
$data = [80, 73, 65, 56, 33, 14, 2];

while(count($data) > 1) {
$diff[] = array_shift($data) - current($data);
}

print_r($diff);


_____________
Стимулятор ~yoomoney - 41001303250491
FatCat
Мне нравится мой вариант и twin.
Хорошо, когда массив уже сидит в переменной. А если мы его тянем из БД? Это во-первых.
А во-вторых, экономия ресурсов. На большом массиве разница почувствуется.

_____________
Бесплатному сыру в дырки не заглядывают...
Valick
Цитата (FatCat @ 26.03.2021 - 13:39)
А если мы его тянем из БД?

тогда ни один код из вышеперечисленных работать не будет


_____________
Стимулятор ~yoomoney - 41001303250491
sg.com
ну ок, приведу и свой вариант в порядок

$data = array(80, 73, 65, 56, 33, 14, 2);
$diff = array();

foreach($data as $key=>$val)
{
if($data[$key+1])
$diff[] = $val - $data[$key+1];
}

print_r($diff);
Bezdna
Цитата (Valick @ 26.03.2021 - 10:31)
надо начать с того, что сама задача несколько странная


Задача в том, чтобы из выводимых значений сумм за некую работу выбрать самую выгодную.


А так - всем спасибо, благодаря этим примерам расширил свои знания. О преимуществах разных примеров судить не буду, в силу собственной некомпетенции в этом вопросе.
FatCat
Цитата (Bezdna @ 27.03.2021 - 13:40)
О преимуществах разных примеров судить не буду, в силу собственной некомпетенции в этом вопросе.

Если по-простому, то 2 принципиально разных подхода:
1. Перебираем массив, и каждый раз залезаем за соседним значением, достаем, вычитаем. Для БД это потребует запросов в цикле.
2. Перебираем массив, запоминаем прошлое значение, вычитаем текущее из прошлого. Для БД это тоже годится.

_____________
Бесплатному сыру в дырки не заглядывают...
killer8080
Цитата (FatCat @ 27.03.2021 - 13:58)
. Перебираем массив, и каждый раз залезаем за соседним значением, достаем, вычитаем. Для БД это потребует запросов в цикле.

Для БД, эту задачу нужно было делать на стороне БД
http://sqlfiddle.com./#!9/81f434/2
но в вопросе источник данных не был указан smile.gif
FatCat
Цитата (killer8080 @ 27.03.2021 - 22:52)
Для БД, эту задачу нужно было делать на стороне БД

Думаешь, это будет быстрее, чем вынуть простым запросом и обсчитать в php?

_____________
Бесплатному сыру в дырки не заглядывают...
Valick
FatCat, однозначно быстрее запросов в цикле.

_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.