PHP CSV в массив, если массив содержит «меня», а затем, если - PullRequest
0 голосов
/ 03 марта 2020

Я работаю над проектом мессенджера php, который читает до 10 строк из CSV-файла в php в виде массива. Я хочу изолировать сообщения «я» от сообщений «вы» в столбце «От». Я хочу поместить каждую строку в отдельную переменную (кроме столбца «От»), содержащую до 5 переменных для меня и 5 переменных для сообщений «вы».

Я думаю, мне нужно сделать foreach l oop через массив и "если" массив содержит "me" в столбце From, затем назначить строку для variable1, иначе, если присвоить строку для variable2 et c ...

Я изо всех сил пытаюсь придумать метод foreach, если в массиве. Пример данных, которые в настоящее время выводятся из кода ниже

From    Time    Message
me  03/02/2020 13:34    test message 001
you 03/02/2020 13:34    test message 002
me  03/02/2020 13:34    test message 003
you 03/02/2020 13:34    test message 004
me  03/02/2020 13:34    test message 005
you 03/02/2020 13:34    test message 006
me  03/02/2020 13:34    test message 007
you 03/02/2020 13:34    test message 008
me  03/02/2020 13:34    test message 009
you 03/02/2020 13:34    test message 010
<?php

$filename = 'messenger.csv';
// Open the file for reading
$datadump  = [];

if (($h = fopen("{$filename}", "r")) !== FALSE) 
{
  // Each line in the file is converted into an individual array that we call $$
  // The items of the array are comma separated
  while (($data = fgetcsv($h, 1000, ",")) !== FALSE) 
  {
    // Each individual array is being pushed into the nested array
  $datadump[] = $data;
  }

  // Close the file
  fclose($h);
}

// Display the code in a readable format

$build = '<table><thead><th>From</th><th>Time</th><th>Message</th></thead><tbody>;
foreach($datadump as $row)
{
$build .= '<tr>';
foreach($row as $item)
{
$build .= "<td>{$item}</td>";
}
$build .= '</tr>';
}
$build .= '</tbody></table>';
echo $build;
?>```

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Просто проверьте внутри foreach l oop, является ли первый индекс массива $data сообщением от me или you , затем назначьте оставшуюся часть массива в соответствующий результирующий массив (я или вы). Попробуйте код ниже:

$row = 1; // First line index
$me = []; // Me array;
$you = []; // You array

// Open the file for reading
if (($file = fopen("example.csv", "r")) !== FALSE) {

    // Convert each line into the local $data variable
    while (($data = fgetcsv($file, 1000, ",")) !== FALSE) {

        // To skip the file headers
        if ($row == 1) {
            $row++;
            continue;
        }

        // Change how you want to output the result
        $message = "Message: $data[2] at $data[1]";

        if($data[0] == "me") {
            $me[] = $message;
        } else if($data[0] == "you"){
            $you[] = $message;
        }
    }

    // Close the file
    fclose($file);
}

// Array of me
echo "<pre>";
print_r($me);
echo "<pre/>";

// Array of you
echo "<pre>";
print_r($you);
echo "<pre/>";

Редактировать:

$row = 1; // first line index
$messages = []; // messages array

// Open the file for reading
if (($file = fopen("example.csv", "r")) !== FALSE) {

    // Convert each line into the local $data variable
    while (($data = fgetcsv($file, 1000, ",")) !== FALSE) {

        // skip the file headers
        if ($row == 1) {
            $row++;
            continue;
        }

        $messages[] = [
            "sender"    => $data[0],
            "datetime"  => $data[1],
            "message"   => $data[2]
        ];
    }

    // Close the file
    fclose($file);
}

// Comparison function 
function date_compare($element1, $element2)
{
    $datetime1 = strtotime($element1['datetime']);
    $datetime2 = strtotime($element2['datetime']);
    return $datetime1 - $datetime2;
}

// Sort the array  
usort($messages, 'date_compare');

Тогда для вывода:

<!DOCTYPE html>
<html>
<head>
    <style>
        table {
            border-collapse: collapse;
            width: 100%;
        }

        th, td {
            text-align: left;
            padding: 8px;
        }

        tr:nth-child(even) {
            background-color: #f2f2f2
        }

        th {
            background-color: #4CAF50;
            color: white;
        }
        .me {
            color: red;
        }
        .you {
            color: blue;
        }
    </style>
</head>
<body>
    <table>
    <tr>
        <th>From</th>
        <th>Time</th>
        <th>Message</th>
    </tr>
    <?php 
        foreach ($messages as $message) { 
            $style = "class='me'";
            if($message["sender"] == "you") {
                $style = "class='you'";
            }
    ?>
        <tr <?php echo $style;?> >
            <td><?php echo $message["sender"]; ?></td>
            <td><?php echo $message["datetime"]; ?></td>
            <td><?php echo $message["message"]; ?></td>
        </tr>
    <?php } ?>        
    </table>
</body>
</html>
0 голосов
/ 03 марта 2020

Добро пожаловать в StackOverflow.

  • При вставке кода рядом с <tbody$ возникает ошибка. Вы можете исправить это, нажав edit под вашим постом.
  • Какой результат вы пытаетесь достичь?
  • В качестве отправной точки вы можете присмотреть что-то вроде этого:
if (strpos($data, 'me') === 0) {
    // this line starts with "me"
} elseif (strpos($data, 'you') === 0) {
    // this line starts with "you"
} else {
    // this line starts with anything else
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...