Добавить значения из 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. Если это так, посчитайте, сколько раз это правда.
Помощь приветствуется. Спасибо!

1

Решение

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

  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. Способ построения структуры данных требует, чтобы у вас было одинаковое количество индексов для обоих ваших подмассивов. Что может привести к нежелательным ошибкам, если вы забудете, чтобы это было так.

0

Другие решения

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

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 вариант в MySQL SELECT, Вы можете прочитать это: Mysql Tutorials — Группировка по

-1

По вопросам рекламы [email protected]