Вариант разделения с разделителем | в n-параметры в php

У меня есть раскрывающееся меню, которое заполняется данными, полученными из базы данных. это выглядит так: Вариант разделения с разделителем | в n-параметры в php

Как я могу разделить такие опции, как GPOS RETAIL|INVENTORY STANDARD, на отдельные опции GPOS RETAIL и INVENTORY STANDARD. Кроме того, как я могу удалить повторяющиеся варианты? У меня уже есть DISTINCT в моем запросе, но я предполагаю, что конвейер | влияет на это.

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

PHP:

$qry = "SELECT DISTINCT c.c_id, c.client_name, a.product
    FROM client_list c
    INNER JOIN activities a
    ON c.client_name = a.client
    WHERE c.c_id = '".$_POST['client']."' AND a.product IS NOT NULL
    ORDER BY c.c_id";
$res = mysql_query($qry);

if (mysql_num_rows($res) > 0) {
    echo '<option value = "">SELECT SOFTWARE / HARDWARE</option>';
    while($row = mysql_fetch_array($res)) {
        echo '<option value = "'.$row[2].'">'.$row[2].'</option>';
    }
} 
else {
    echo '<option value = "">No Record</option>';
}

Одно из того, что я пробовал:

if (isset($_POST['client'])) {  
            $qry = "SELECT DISTINCT c.c_id, c.client_name, a.software_hardware
                FROM client_list c
                INNER JOIN activities a
                ON c.client_name = a.client
                WHERE a.software_hardware IS NOT NULL AND c.c_id = '".$_POST['client']."'
                ORDER BY a.`software_hardware`";
            $res = mysql_query($qry);

            if (mysql_num_rows($res) > 0) {
                echo '<option value = "">SELECT SOFTWARE / HARDWARE</option>';
                while($row = mysql_fetch_array($res)) {
                    $list = "";
                    $arr = explode("|", $row[2]);
                    if (!empty($arr)){
                        for($i = 0; $i<=$ctr; $i++) {           
                           $list .= "<option value='$arr[$i]'>$arr[$i]</option>";
                        }
                    }
                    echo $list;
                    // echo '<option value = "'.$row[2].'">'.$row[2].'</option>';
                }
            } 
            else {
                echo '<option value = "">No Record</option>';
            }
        } 

Я не знаю куда идти отсюда

Прежде всего: НЕ ИСПОЛЬЗУЙТЕ больше функции mysql_ *! Они объявлены устаревшими в PHP5.6 и удалены в PHP7. Вместо этого используйте функции PDO или mysqli_ *. В конце концов, ваш синтаксис SQL ужасно открыт для внедрения sql. Вы должны рассматривать подготовленные заявления из соображений безопасности. Чтобы ответить на ваш вопрос: PHP взорвать решит вашу проблему и специально рассмотрит ваш цикл foor. Произошла ошибка.

Marcel 23.03.2018 09:45

@Marcel, спасибо за то, что я знаю об устаревшей проблеме, просто компания, в которой я работаю, все еще использует ее: / Я понял, что использовал Explode после того, как опубликовал, но в том, что я сделал до сих пор, все еще чего-то не хватает (см. Правка)

Mel 23.03.2018 09:48

Посмотрите ответ @Fenix ​​Lam. Ваш цикл for обращается к неправильной переменной. Вместо $ctr используйте $arr. Я не знаю, что сказать компаниям, которые используют устаревшие сегодня методы.

Marcel 23.03.2018 09:50
Стоит ли изучать 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 и хотите разрабатывать...
0
3
68
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

 for($i = 0; $i<=$ctr; $i++) {
   ...
 }

должно быть

for($i = 0, $length = count($arr); $i < $length; $i++) {

это все

Это должен быть принятый ответ, потому что Феникс увидел, что цикл for обращается к неправильной переменной.

Marcel 23.03.2018 09:54

@marcel, я только что попробовал, и он не отображает параметры

Mel 23.03.2018 09:55

Правда. Вы должны узнать длину массива: for ($i = 0, $length = count($arr); $i < $length; $i++ ) {}. В вашем коде переменная $ctr не определена.

Marcel 23.03.2018 09:59

Вы можете использовать explode и foreach в PHP. Вам нужна дополнительная проверка, чтобы у вас не было пустых строк. Это примерно так:

if (mysql_num_rows($res) > 0) {
    echo '<option value = "">SELECT SOFTWARE / HARDWARE</option>';
    while($row = mysql_fetch_array($res)) {
        $names = explode("|",$row[2]);
        foreach ( $names as $name ) {
           if ( $name != "" ) {
             echo '<option value = "'.$name.'">'.$name.'</option>';
           }
        }
    }
} 

Я добавил разнесение, которое создает массив из строки имени с символом "|" разделители. После этого вы просматриваете каждый элемент массива, и если он не пустой, вы добавляете его как вариант. Пожалуйста, я не изменил ссылку на строки на «$ name».

Привет! Я понял, используя взорваться поздно. Я обновил свой код, но чего-то по-прежнему не хватает. Я попробую, спасибо! \

Mel 23.03.2018 09:50

это сработало! благодарю вас! дополнительный вопрос, как я могу удалить повторяющиеся части GPOS?

Mel 23.03.2018 09:52

Это зависит от того, как вы хотите это сделать. Лично я бы как-то изменил таблицу или SQL-запрос, чтобы он работал нормально, но я слепой. В PHP вы можете сохранить все уже напечатанные строки в массив и проверить с помощью in_array ($ Need, $ haystack), если он уже был напечатан, и воздержаться от печати, если это было.

kry 23.03.2018 09:57

substr ($ имя, 5, strlen ($ имя))

Fenix Lam 23.03.2018 09:58
Ответ принят как подходящий

Вы можете использовать следующее решение:

$items = [];

//get all items from database and explode the concat values.
while($row = mysql_fetch_array($res)) {
    $items = array_merge($items, explode('|', $row[2]));
}

//get only the distinct items.
$items = array_unique($items);

//remove the emtpy items.
$items = array_filter($items);

//initialize the list.
$list = '<option value = "">SELECT SOFTWARE / HARDWARE</option>';

//create the list of unique items.
foreach ($items as $item) {
    $list .= '<option value = "'.$item.'">'.$item.'</option>';
}

Объяснение:

  • Вы можете удалить все дубликаты, используя array_unique. Каналы (|) удаляются с помощью функции explode в цикле while.
  • Вы можете удалить все пустые элементы, используя array_filter (без обратного вызова).

demo:https://ideone.com/YWdKFU

Прежде всего, небольшой намек на то, что вам больше не следует использовать функции mysql_ *. Я знаю, что вы сказали, что ваша компания использует устаревшую версию php. Но ... вы знаете, что вы работаете дважды, и они будут платить намного больше денег за разработку и так далее.

Ваш цикл for - это проблема. Вы можете решить уникальные значения там, а переменная $ctr, которую вы используете в своем цикле for, никогда не определялась.

$arr = $arr = explode("|", $row[2]);
$arr = array_unique($arr);
for ($i = 0, $length = count($arr); $i < $length; $i++) {
    ...
}

Функция array_unique отсортирует повторяющиеся значения в вашем массиве. После этого цикл for перебирает уникальные значения вашего массива.

В конце концов, вы должны подумать о нормализации структуры вашей базы данных. Не рекомендуется сохранять значения типа «значение1 | значение2 | значение3». Подумайте о структуре «один ко многим» или «многие ко многим». Это сделает жизнь намного проще.

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