Сохранение массива в виде файла CSV с использованием PHP - PullRequest
0 голосов
/ 02 мая 2018

Этот код анализирует содержимое двух сайтов, отбирая у них все атрибуты href. Затем он находит те, которые имеют наибольшее совпадение значения href из каждого массива, и сохраняет их в файл CSV. Проблема в том, что когда я открываю файл, он возвращает также данные HTML моего приложения.

В качестве упражнения я могу использовать только HTML и PHP

<html>
  <body>
    <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post">
      website: 
      <input type="text" name="website1">
      <br>
      website: 
      <input type="text" name="website2">
      <br>
      <input type="submit" name="submit">
    </form>
  </body>
</html>

<?php

if (isset($_POST['submit']))
    {

    // form has been submitted

    $url1 = $_POST['website1'];
    $url2 = $_POST['website2'];
    findAndCompare($url1, $url2);
    }
  else
    {
    }

function findAndCompare($url1, $url2)
    {
     libxml_use_internal_errors(true);
    // Create a DOM parser object

    $dom1 = new DOMDocument();
    $dom2 = new DOMDocument();
    $dom1->loadHTMLFile($url1);
    $dom2->loadHTMLFile($url2);
    $arr1 = array();
    $arr2 = array();
    $arr3 = array();

    // Iterate over all the <a> tags

    foreach($dom1->getElementsByTagName('a') as $link)
        {

        // insert the <a href> in arr1

        array_push($arr1, $link->getAttribute('href'));
        }

    // Iterate over all the <a> tags

    foreach($dom2->getElementsByTagName('a') as $link)
        {

        // insert the <a href> in arr2

        array_push($arr2, $link->getAttribute('href'));
        }

    for ($i = 0; $i < count($arr1); $i++)
        {
        $max_elem = $arr2[0];
        $max = 0;
        for ($j = 0; $j < count($arr2); $j++)
            {
            similar_text($arr1[$i], $arr2[$j], $perc);
            if ($perc > $max)
                {
                $max = $perc;
                $max_elem = $arr2[$j];
                }
            }

        $tmp = array($arr1[$i],$max_elem,$max);
        array_push($arr3,$tmp);
        }

    function convert_to_csv($input_array, $output_file_name, $delimiter)
        {
        $temp_memory = fopen('php://memory', 'w');

        // loop through the array

        foreach($input_array as $line)
            {

            // use the default csv handler

            fputcsv($temp_memory, $line, $delimiter);
            }

        fseek($temp_memory, 0);

        // modify the header to be CSV format

        header('Content-Type: application/csv');
        header('Content-Disposition: attachement; filename="' . $output_file_name . '";');

        // output the file to be downloaded

        fpassthru($temp_memory);
        }

    convert_to_csv($arr3, 'export.csv', ',');
    }

?>

UPDATE я решаю это поставив ob_clean(); до header

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вы не можете использовать header(), если уже есть вывод.

Переместите html формы в первый оператор else.

Кроме того, убедитесь, что вы включили отчеты об ошибках, потому что php объяснил бы вам это.

0 голосов
/ 02 мая 2018

HTML действительно будет выводиться, потому что это первое, что делает ваш код.

Как вы уже знаете, PHP позволяет смешивать HTML и код в одном файле, используя маркеры <?php и ?> для обозначения начала и конца кода PHP.

Все, что находится за пределами этих маркеров, считается выводом и отправляется в браузер точно так же, как если бы вы использовали оператор print() или echo().

Ваш код начинается с блока HTML, перед которым ничего нет. Это точно так же, как если бы вы запустили программу с оператором print(), содержащим этот HTML.

Если вы не хотите, чтобы HTML выводился во всех случаях, вам нужен код перед ним, чтобы сообщить, когда и нужно ли выводить его.

...