Сбой PHP 2D-массива - PullRequest
       7

Сбой PHP 2D-массива

0 голосов
/ 28 ноября 2018

Я чувствую себя довольно глупо, когда спрашиваю об этом, так как чувствую, что должен был бы это выяснить, но, увы, я трачу на это слишком много времени и расстраиваюсь, поэтому решил, что попросил бы помочь.У меня есть массив PHP, который выглядит следующим образом.Это только пример, так как этот проект находится в стадии разработки:

$donations = array(
    "2018 December" => array('30','20','100'),
    "2018 November" => array('10','5','200','1000')
);

Я сделал несколько попыток для вложенных циклов for и foreach, чтобы попытаться получить значения, и я могу подобраться, но яКажется, всегда сталкиваешься с разными дорожными блоками.Например, я имел год и месяцы как часть подмассива.Мне удалось успешно извлечь все значения с помощью цикла for и затем foreach, но я не мог понять, как исключить первые два элемента (год и месяц) в foreach.Вот конечная цель ...

Каждый вложенный массив содержит пожертвования отдельных членов в долларах США.Массив может увеличиваться в течение текущего месяца, так как поступает больше пожертвований, но как только пролонгируется месяц, подмассив следующего месяца начинает заполняться пожертвованиями, а предыдущий месяц «архивируется».Мне нужно сложить все пожертвования для каждого вложенного массива и сделать доступным каждое значение, которое будет представлено в процентах (от округления до ближайшего целого числа) в виде гистограммы, отображаемой на веб-странице.

Может кто-нибудь помочь, пожалуйстамне формализовать мой процесс?

Это то, что я пытался изначально.Это использует более старый, более уродливый массив.Следует отметить, что эта версия в настоящее время не округляется до ближайшего целого числа.Еще не разобрался в этой части.Эти цифры просто хорошо тренируются в этом примере.Также, если вам интересно, общая сумма в долларах рассчитывается отдельно в другой части страницы.$ total = эксплуатационные расходы в месяц для группы, но в этом примере я вручную установил его на 100 $.

$donate = array(
    array("5","10"),
    array("20","30"),
    array("0"),
    array("0"),
    array("0")
);

$keydonate = array_keys($donate);
$taco = array();
for($i = 0; $i < count($donate); $i++) {
    foreach($donate[$keydonate[$i]] as $value) {
        $sum = $sum + $value;
        $taco[$i] = ($sum/$total)*100;
    }
}

Это вроде работает, но, опять же, моя логика здесь сильно ошибочна, и у этого метода есть довольно серьезные ошибки.Например, массивы продолжают складываться друг с другом за предыдущие месяцы.Каждый месяц им нужно возвращаться к настройкам по умолчанию.Обратите внимание, что на снимке экрана декабрь - это сумма декабря и ноября, а затем снова и снова?Кроме того, мне нравится возможность добавлять месяц и год к массиву, который эта версия не может обрабатывать.Мне нужны серьезные рекомендации и примеры, как правильно сделать это, пожалуйста.Я знаю достаточно PHP, чтобы быть опасным!

Спасибо!

Progress bars

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

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

<?php
        //Enter your code here, enjoy!

$donations = array(
    array('2018', 'December', '30','20','100'),
    array('2018', 'November', '10','5','200','1000')
);

$total = 75;


$taco = array();
for($i = 0; $i < count($donations); $i++) {
    $sum = 0;
    for($j = 2; $j < count($donations[$i]); $j++) {
        $sum += $donations[$i][$j];
        }
        //echo $sum." ";
    $taco[$i] = ($sum/$total)*100;
}

for($i = 0; $i < count($donations); $i++){
    echo "Month ". $donations[$i][0]." ".$donations[$i][1]." raised ".$taco[$i]." % of monthly costs."."\r\n";
}

Это больше того, что вы ищете?Выход: enter image description here

0 голосов
/ 28 ноября 2018

Хорошо, я бы хотел, чтобы оригинальный парень, который дал мне этот ответ, не удалил свой пост.Решение было правильным!Я просто должен был сделать небольшую модификацию, чтобы соответствовать моим целям.Вот рабочее решение со скриншотом.Спасибо, загадочный пользователь!Спасибо всем остальным за ваше время и материалы.

<?php
    //------------ MEMBER DONATIONS ------------
    $donations = [
        "2019 March" => ['100','8.61'],
        "2019 February" => ['0.12','0.45','1.76','4.23','1.23','9.34','2.34','1.23','5.55','9.21'],
        "2019 January" => ['10','10','10','10','5'],
        "2018 December" => ['0'],
        "2018 November" => ['10']
    ];
    //------------------------------------------

    $totalSum = 0;
    $monthlySums = [];
    $monthlyPercentages = [];
    foreach($donations as $month => $values) {
        $monthlySums[$month] = array_sum($values);
        $totalSum += $monthlySums[$month];
    }
    foreach($monthlySums as $month => $monthlySum) {
        $monthlyPercentages[$month] = round($monthlySum / $total * 100,2);
        if($monthlyPercentages[$month] > 100){
            $monthlyPercentages[$month] = 100;
        }
    }
?>

, а затем HTML

    <?php
        foreach(array_keys($donations) as $month) {
            echo "<div class='prog-font'>". $month ."</div><div class='prog-cont'><div class='prog-fill' style='width:". $monthlyPercentages[$month] ."%'><span style='padding-left: 5px;'>". $monthlyPercentages[$month] ."%</span></div></div><div class='prog-goal'>Operating Expenses $". $total ."</div><br />";
        };
    ?>

enter image description here

Я решилчтобы разрешить два десятичных знака, и я решил включить несколько простых ограничений, чтобы предотвратить перетекание гистограммы.В идеале, если один месяц будет полностью профинансирован, остаток будет перенесен на следующий месяц, но пока я буду заниматься этим вручную.Будет работать над дополнительной автоматизацией позже.Просто приятно, что это изначально и работает.Спасибо!

0 голосов
/ 28 ноября 2018

Вы были действительно близки.

Похоже, единственная причина, по которой код, который вы пробовали, не работал, это то, что вы не сбрасывали сумму на ноль для каждого месяца.

for($i = 0; $i < count($donate); $i++) {
    $sum = 0;                                        // <----- Like this
    foreach($donate[$keydonate[$i]] as $value) {
        $sum = $sum + $value;
        $taco[$i] = ($sum/$total)*100;
    }
}

Существуют и другие вещи, которые можно оптимизировать, но это все, что вам нужно, чтобы заставить его работать.


Некоторые предложения по оптимизации:

Обычно лучше использоватьцикл foreach для итерации массива.Цикл for обычно лучше выполнять что-либо фиксированное количество раз.И вычисление процента во внутреннем цикле немного расточительно (вы пересчитываете его для каждого числа во внутреннем массиве, но только с использованием последнего).Вы можете вычислить его после завершения цикла.

foreach ($donate as $month => $values) {
    $sum = 0;
    foreach($values as $value) {
        $sum += $value;
    }
    $taco[$month] = ($sum/$total)*100;
}

Или, что еще лучше, используйте встроенную функцию для суммирования внутреннего массива вместо другого цикла.

foreach ($donate as $month => $values) {
    $taco[$month] = array_sum($values) / $total * 100;
}
...