PHP - массив из пользовательского ввода - PullRequest
0 голосов
/ 07 ноября 2018

Я пытался около трех дней, и я просто не могу понять это. Цель состоит в том, чтобы пользователь ввел числа и отфильтровал уникальные числа. Скажем, пользователь вводит числа: 24, 24, 56, 23, 1, 3, 24 - вывод должен быть 24, 56, 23, 1, 3. До этого момента все работает. Единственное, когда я нажимаю кнопку отправки, она не возвращает никаких значений.

    <!DOCTYPE html>
    <!--    e9_1.php
    Project1.php
    -->
    <html lang = "en">
    <head> 
      <title> Project1.php </title>
      <meta charset = "utf-8" />
      <?php

      function unique($strings) {
         $uniqueStrings = array();
         foreach ($strings as $string) {
            foreach ($uniqueStrings as $uString) {
               if ($string == $uString) break;
               if(isset($_POST[‘numbers’])){
                  $str=preg_split("/[\s,]", $_POST['numbers']);
               }
            }
            if ($string != $uString)
               $uniqueStrings[] = $string;
         }
         return $uniqueStrings;
      }
      ?>
    </head>
    <body>
    <?php
    $str = array();
    $uStr=unique($str);
    foreach ($uStr as $st)
    print ("$st <br />");
    ?>

    <br>
    Enter Numbers: <br>
    <form method = "POST">
    <input type="text" name="numbers"/>
    <input type="submit" name="Submit" />

    </body>
    </html>

Ответы [ 3 ]

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

Вы получаете пользовательский ввод из одного текстового ввода.

<input type="text" name="numbers"/>

Это означает, что $_POST['numbers'] будет строкой, а не массивом, поэтому ваша unique функция должна принимать строку.

Если вы ищете уникальные числа, вероятно, лучше сделать положительное совпадение для последовательностей цифр, а не разбивать на пробелы или что-то еще, в этом отношении.

Ваша функция довольно сложна, когда в PHP уже есть функция array_unique. Нужно просто сопоставить числа в строке и запустить полученный массив через array_unique. Кроме того, я бы рекомендовал не ссылаться на суперглобальный тип, например $_POST, в такой вспомогательной функции. Если вы хотите, чтобы его можно было использовать повторно, он должен принимать входные данные в качестве аргумента, а не в зависимости от глобального значения.

Исходя из всего этого, я написал бы такую ​​функцию:

function unique_numbers(string $input): array
{
    preg_match_all('/\d+/', $input, $matches);
    return array_unique($matches[0]);
}

и назовите его отправленной строкой

$numbers = unique_numbers($_POST['numbers']);
0 голосов
/ 07 ноября 2018

Как насчет использования функций PHP, чтобы сделать его проще?

<!DOCTYPE html>
<html lang = "en">
<head> 
  <title> Project1.php </title>
  <meta charset = "utf-8" />
</head>
<body>
    <?php
    if (isset($_POST['numbers'])) {

        $strings = $_POST['numbers'];
        $str = explode(",", $strings);
        $uStr=array_unique($str);
        echo implode(",", $uStr);
    }
    ?>

    <br>
    Enter Numbers: <br>
    <form method = "POST">
    <input type="text" name="numbers"/>
    <input type="submit" name="Submit" />

</body>
</html>
0 голосов
/ 07 ноября 2018

Вот рабочий фрагмент для вашей задачи. Я переписал большую часть этого.

<?php

//$_POST['numbers'] = " 24, 24, 56, 23, 1, 3, 24";

function getNumbers($string) {
    $string = preg_replace("/[\s]/","",$string); // remove all possible space, tabs, etc
    $n = explode(",", $string); // a simple explode will be enough then
    return $n;
}

$numbers=array_unique(getNumbers($_POST['numbers'])); // finally use array_unique() to get rid of the doubles.

var_dump($numbers);

// OUTPUT:
array(5) {
  [0]=>
  string(2) "24"
  [2]=>
  string(2) "56"
  [3]=>
  string(2) "23"
  [4]=>
  string(1) "1"
  [5]=>
  string(1) "3"
}

Фрагмент можно найти здесь: https://3v4l.org/BK0eU

Проблемы в вашем коде были:

  • пустой массив в качестве входных данных для уникальной функции
  • preg_replace отсутствует конечный разделитель
  • $_POST[‘numbers’] с фигурными кавычками
  • кодирование функции, которая уже существует (array_unique) ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...