Bezdna
25.03.2021 - 23:10
В очередной раз запнулся об простейшую, вроде бы, задачу: имеется массив отортированных числовых значений, допустим "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
25.03.2021 - 23:37
Это не код, набросок, но может сработает
$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
26.03.2021 - 04:24
Я бы сделал так:
$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
26.03.2021 - 11:31
Bezdna, надо начать с того, что сама задача несколько странная
_____________
Стимулятор ~yoomoney - 41001303250491
Valick
26.03.2021 - 13:05
<?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
Ну или как то так, попрозрачнее:
$data = [80, 73, 65, 56, 33, 14, 2];
$diff = [];
$current = $data[0];
while($next = next($data)){
$diff[] = $current - $next;
$current = $next;
}
print_r($diff);
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Valick
26.03.2021 - 14:12
Николай, немного подрихтовал твой вариант
<?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
26.03.2021 - 14:39
Мне нравится мой вариант и twin.
Хорошо, когда массив уже сидит в переменной. А если мы его тянем из БД? Это во-первых.
А во-вторых, экономия ресурсов. На большом массиве разница почувствуется.
_____________
Бесплатному сыру в дырки не заглядывают...
Valick
26.03.2021 - 15:44
Цитата (FatCat @ 26.03.2021 - 13:39) |
А если мы его тянем из БД? |
тогда ни один код из вышеперечисленных работать не будет
_____________
Стимулятор ~yoomoney - 41001303250491
sg.com
26.03.2021 - 19:22
ну ок, приведу и свой вариант в порядок
$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
27.03.2021 - 14:40
Цитата (Valick @ 26.03.2021 - 10:31) |
надо начать с того, что сама задача несколько странная |
Задача в том, чтобы из выводимых значений сумм за некую работу выбрать самую выгодную.
А так - всем спасибо, благодаря этим примерам расширил свои знания. О преимуществах разных примеров судить не буду, в силу собственной некомпетенции в этом вопросе.
FatCat
27.03.2021 - 14:58
Цитата (Bezdna @ 27.03.2021 - 13:40) |
О преимуществах разных примеров судить не буду, в силу собственной некомпетенции в этом вопросе. |
Если по-простому, то 2 принципиально разных подхода:
1. Перебираем массив, и каждый раз залезаем за соседним значением, достаем, вычитаем. Для БД это потребует запросов в цикле.
2. Перебираем массив, запоминаем прошлое значение, вычитаем текущее из прошлого. Для БД это тоже годится.
_____________
Бесплатному сыру в дырки не заглядывают...
killer8080
27.03.2021 - 23:52
Цитата (FatCat @ 27.03.2021 - 13:58) |
. Перебираем массив, и каждый раз залезаем за соседним значением, достаем, вычитаем. Для БД это потребует запросов в цикле. |
Для БД, эту задачу нужно было делать на стороне БД
http://sqlfiddle.com./#!9/81f434/2но в вопросе источник данных не был указан
FatCat
28.03.2021 - 17:22
Цитата (killer8080 @ 27.03.2021 - 22:52) |
Для БД, эту задачу нужно было делать на стороне БД |
Думаешь, это будет быстрее, чем вынуть простым запросом и обсчитать в php?
_____________
Бесплатному сыру в дырки не заглядывают...
Valick
28.03.2021 - 21:43
FatCat, однозначно быстрее запросов в цикле.
_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.