Добавить значения из mysqli_fetch_array

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

Итак, это часть кода:

$verbindung = mysqli_connect($server, $user, $pass, $database)
                    or die ($meldung);

    $driverID = $_POST['fahrer'];

    $datum_von = $_POST['date_von'];
    //Change Date Format
    $datum_von_new = date_format(new DateTime($datum_von), 'Y-m-d');

    $datum_bis = $_POST['date_bis'];
    //Change Date Format
    $datum_bis_new = date_format(new DateTime($datum_bis), 'Y-m-d');

    $sql = "SELECT drivers.forename, drivers.surname, results.positionOrder, races.name, races.date ";
    $sql.= "FROM drivers ";
    $sql.= "INNER JOIN results ON drivers.driverId = results.driverId ";
    $sql.= "INNER JOIN races ON results.raceId = races.raceId ";
    $sql.= "WHERE drivers.driverId = '$driverID' "; 
    $sql.= "AND races.date BETWEEN '$datum_von_new' ";
    $sql.= "AND '$datum_bis_new' ";
    $sql.= "AND results.positionOrder <= 10;"   

<table class = "table table-striped">
        <thead class = "thead-dark">  
            <tr>
              <th scope = "col">Fahrername</th>
              <th scope = "col">Streckenname</th>
              <th scope = "col">Datum</th>
              <th scope = "col">Platzierung</th>
              <th scope = "col">Häufigkeit</th>
            </tr>
        </thead>


    $ergebnis = mysqli_query($verbindung, $sql);
    $countPosition = 0

    if ($ergebnis != False) {
                while($zeile = mysqli_fetch_array($ergebnis)) { 
                    echo "<tr>";
                    echo "<td>" . $zeile['forename'] . ' ' . $zeile['surname'] . "</td>";
                    echo "<td>" . $zeile['name'] . "</td>";
                    echo "<td>" . $zeile['date'] . "</td>";
                    echo "<td>" . $zeile['positionOrder'] . "</td>";
                    for($i = 0; $i<=sizeof($zeile); $i++) {
                        for($j = 0; $j <= sizeof ($zeile); $j++) {
                            if ($zeile['name'][$i] == $zeile['name'][$j] && 
                            $zeile['positionOrder'][$i] == $zeile['positionOrder'][$j]) {
                                $countPosition += 1;
                                echo "<td>" . $countPosition . "</td>";
                        }
                    }
                } 
                    echo "</tr>";

            } else {
                echo mysqli_error($verbindung);
            }

            $result = mysqli_close($verbindung);

Итак, моя цель - проверить, совпадает ли имя в строке 1 с именем в строке 2 И если positionOrder в строке1 равно posisitionOrder в строке 2. Если да, посчитайте, сколько раз это верно. Помощь приветствуется. Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
101
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Когда вы перебираете результаты, вы хотите, чтобы текущая строка читалась по сравнению с последней, которую вы обработали.

for($i = 0; $i<=sizeof($zeile); $i++) {
    if ($i != 0 && $zeile['name'][$i] == $zeile['name'][$i - 1] && 
        $zeile['positionOrder'][$i] == $zeile['positionOrder'][$i - 1]) {
        $countPosition += 1;
        echo "<td>" . $countPosition . "</td>";
    }
}

Приведенный выше код будет перебирать строки только один раз, но всегда будет сравнивать последнюю прочитанную строку с текущей. Он не будет проверять более ранние строки (только предыдущую). Так что это может быть не идеальное решение, которое вы ищете. Лучшим вариантом может быть использование опции group by в MySQLSELECT. Вы можете прочитать это: Учебники Mysql - Группировка по

Ответ принят как подходящий

Итак, несколько вещей.

  1. Вы захотите изменить <= на < в своем цикле for, иначе вы получите исключение индекса за пределами привязки. См. Следует ли использовать <или <= в цикле for

  2. Вы могли бы решить эту проблему намного проще, используя MySql, к сожалению, вы не поделились своим SQL-запросом, поэтому я не могу написать это для вас. Но это будет какая-то форма group by.

  3. Я заметил, что вы делаете $zeil['name'][$j] для многих вещей по сравнению с $zeil[$j]['name'], что для меня странно, поскольку это означает, что у вас есть массив каждого элемента, а не массив «объектов» (вроде) со свойствами, прикрепленными к их. Это не обычная практика, но я все же постараюсь с ней работать.

Предположим, ваш массив выглядит так:

$zeil = [
    'name' => [
         'nathan',
         'raverx1',
         'someone',
         'nathan',
         'nathan',
         'nathan',
         'anyone',
         'nathan',
         'anyone',
    ],
    'positionOrder' => [
         4,
         7,
         9,
         4,
         4,
         4,
         7,
         4,
         7
    ]
];

Вам понадобится этот код для выполнения вашей задачи:

// Loop through your main array while tracking
// the current index in the variable $i.
// Since you're using sub arrays, we use them
// as the index. Which means the sub arrays
// have to be of identical size, else you will
// get an index out of bounds error.
for($i = 0; $i < sizeof($zeil['name']); $i++) {

    // We set this to an initial value of 1 since
    // it is the first occurrence.
    $occurrenceCount = 1;

    // Create local variables containing the current values.
    $name = $zeil['name'][$i];
    $positionOrder = $zeil['positionOrder'][$i];

    // Loop through all previous entries to
    // compare them to the current one.
    for($j = $i-1; $j > -1; $j--) {
        if (
            $zeil['name'][$j] == $name &&
            $zeil['positionOrder'][$j] == $positionOrder
        ) {
            $occurrenceCount += 1;
        }
    }

    // If multiple occurrences were found
    // for this entry, output them.
    if ($occurrenceCount > 1)
        echo 'Occurrence Count ('.$name.') : '.$occurrenceCount.PHP_EOL;
}

Результат будет выглядеть так:

Occurrence Count (nathan) : 2
Occurrence Count (nathan) : 3
Occurrence Count (nathan) : 4
Occurrence Count (nathan) : 5
Occurrence Count (anyone) : 2

Лучший способ сделать это - сохранить количество вхождений для чего-либо с более чем 1 вхождением в собственном массиве, а затем распечатать их.

$multipleOccurrences = [];

// Loop through your main array while tracking
// the current index in the variable $i.
// Since you're using sub arrays, we use them
// as the index. Which means the sub arrays
// have to be of identical size, else you will
// get an index out of bounds error.
for($i = 0; $i < sizeof($zeil['name']); $i++) {

    // We set this to an initial value of 1 since
    // it is the first occurrence.
    $occurrenceCount = 1;

    // Create local variable containing the current values.
    $name = $zeil['name'][$i];
    $positionOrder = $zeil['positionOrder'][$i];

    // Loop through all previous entries to
    // compare them to the current one.
    for($j = $i-1; $j > -1; $j--) {
        if (
            $zeil['name'][$j] == $name &&
            $zeil['positionOrder'][$j] == $positionOrder
        ) {
            $occurrenceCount += 1;
        }
    }

    // If multiple occurrences were found
    // for this entry, store them using $name as the key.
    if ($occurrenceCount > 1)
        $multipleOccurrences[$name] = $occurrenceCount;
}

// Print the occurrences.
echo 'All occurrences greater than \'1\''.PHP_EOL;
echo '--------------------------------'.PHP_EOL;
foreach ($multipleOccurrences as $name => $occurrenceCount) {
    echo 'Occurrences ('.$name.') : '. $occurrenceCount . PHP_EOL;
}

Результат будет выглядеть так:

All occurrences greater than '1'
--------------------------------
Occurrences (nathan) : 5
Occurrences (anyone) : 2

Имейте в виду, что есть несколько вещей НЕПРАВИЛЬНЫХ с вашим первоначальным подходом.

  1. Фактически вы не отслеживаете вхождения, поскольку каждая итерация также добавляет все предыдущие вхождения в переменную $occurrenceCount.

  2. Используемая вами структура данных не особенно удобна для правильного отслеживания количества вхождений. Хранение подмассивов для значений ненормально, более распространенный способ будет выглядеть примерно так:

    $zeil = [
        [
            'name' => 'nathan',
            'positionOrder' => 4
        ],
        [
            'name' => 'bob',
            'positionOrder' => 10
        ],
    
        . . .
    ];
    
  3. Способ построения вашей структуры данных требует, чтобы у вас было одинаковое количество индексов для обоих ваших подмассивов. Что может привести к нежелательным ошибкам, если вы забудете об этом.

Привет, Натан, спасибо за подробный ответ. Я пройду по пунктам, о которых вы упомянули. Это займет некоторое время, потому что я только начал писать код в этом семестре. Я очень ценю вашу помощь в этом. Я добавил оператор SQL в свой исходный пост, но я не должен использовать какие-либо агрегатные функции в sql (группировка, сумма и т. д.). Я должен решить это с помощью небольшого алгоритма.

raverx1 16.12.2018 18:33

@ raverx1, если ответ помог принять его :)

Nathan F. 16.12.2018 22:51

Я заставил его работать с массивом. Спасибо за вашу помощь!

raverx1 15.01.2019 12:35

Другие вопросы по теме