Убрать пустые значения в массиве (array_diff)

159
14 августа 2017, 11:27

Здравствуйте.

Есть задача. При вводе в текстовые поля списка из слов (Ключ 1, Ключ 2, Ключ 3), нужно пересечь эти слова друг с другом и вывести в отдельное текстовое поле (Результат).

Вводя список в виде строк, я перевожу их в список-массив, разбивая строку на значения массива.

Мне также нужно, чтобы перед пересечением слов у массивов не было пустых значений. Для этого использую функцию array_dif(). Но если я вбиваю ключи в текстовые поля и где-то пропуская значение, оставляя пускую строку, эта функция не срабатывает, а мне выводится пересечение нормального значения с пустым. Вместо 3-х слов - два. Вместо 2-х - одно.

Вопрос 1. Как реализовать удаление пустых значений в массиве перед их пересечением?

Вопрос 2. Как вывести эти значения в текстовое поле "Результат"?

Код ниже:

<?php        
function keys()
    {
        // Берём ключи из форм
        $key1 = $_POST['key1'];
        $key2 = $_POST['key2'];
        $key3 = $_POST['key3'];
        // Переводим строки в массив
        $key1_array = explode("\n", $key1);
        $key2_array = explode("\n", $key2);
        $key3_array = explode("\n", $key3);
        // Убираем пустые (нулевые) значения в массивах
        $key1_array = array_diff($key1_array, array('', null));
        $key2_array = array_diff($key2_array, array('', null));
        $key3_array = array_diff($key3_array, array('', null));
        // Пересекаем все значения ключей массивов друг с другом
        for($a = 0; $a < count($key1_array); $a++)
        {
            for($b = 0; $b < count($key2_array); $b++)
            {
                for($c = 0; $c < count($key3_array); $c++)
                {
                    $massiv = $key1_array[$a].' '.$key2_array[$b].' '.$key3_array[$c];
                    echo $massiv.'<br>';
                }
            }
        }
    }
    keys();
?>
<!DOCTYPE html>
<html>
<head>
    <title>PPC</title>
    <meta charset="utf-8">
</head>
<body>
    <form action="<?=$_SERVER['PHP_SELF']?>" method="post">
        <label>
            Ключи 1: <textarea name="key1" rows="5"></textarea><br>
            Ключи 2: <textarea name="key2" rows="5"></textarea><br>
            Ключи 3: <textarea name="key3" rows="5"></textarea><br>
            Результат: <textarea id="text" name="result" rows="10"><?php keys();?></textarea><br>
        </label>
        <input type="submit" name="" value="Перемножить"><br>
    </form>
</body>
</html>
Answer 1

Вместо

$key1_array = array_diff($key1_array, array('', null));

поставить

foreach($key1_array as $key=>$value){
    if(empty($value) || in_array($value,array("\n","\r","\n\r","\r\n"))){
        unset($key1_array[$key]);
    }
    unset($key,$value);
}

И так для каждого из массивов

Answer 2

Предлагаю сделать вот что:

while(strpos($key1, "\n\n")) $key1 = str_replace("\n\n", "\n", $key1);
Answer 3

Я тебе немного не понял но думаю ты имее в виду это

0 0 0 конец
а б в
0 0 1 конец
а б е
0 1 0 конец
а д в
0 1 1 конец
а д е
1 0 0 конец
г б в
1 0 1 конец
г б е
1 1 0 конец
г д в
1 1 1 конец
г д е

так

<?php        
        // Берём ключи из форм
        $key1 = $_POST['key1'];
        $key2 = $_POST['key2'];
        $key3 = $_POST['key3'];
        // Переводим строки в массив
        $key1_array = explode("\r\n", $key1);
        $key2_array = explode("\r\n", $key2);
        $key3_array = explode("\r\n", $key3);
        // Убираем пустые (нулевые) значения в массивах
        $key1_array = array_diff($key1_array, array('', null));
        $key2_array = array_diff($key2_array, array('', null));
        $key3_array = array_diff($key3_array, array('', null));

        // Пересекаем все значения ключей массивов друг с другом
        for($a = 0; $a < count($key1_array); $a++)
        {
            for($b = 0; $b < count($key2_array); $b++)
            {
                for($c = 0; $c < count($key3_array); $c++)
                {
                    echo $a." ".$b." ".$c." конец<br>";
                    $massiv = $key1_array[$a].' '.$key2_array[$b].' '.$key3_array[$c];
                    echo $massiv.'<br>';
                }
            }
        }
?>
<!DOCTYPE html>
<html>
<head>
    <title>PPC</title>
    <meta charset="utf-8">
</head>
<body>
    <form action="<?=$_SERVER['PHP_SELF']?>" method="post">
        <label>
            Ключи 1: <textarea name="key1" rows="5"></textarea><br>
            Ключи 2: <textarea name="key2" rows="5"></textarea><br>
            Ключи 3: <textarea name="key3" rows="5"></textarea><br>
            Результат: <textarea id="text" name="result" rows="10"></textarea><br>
        </label>
        <input type="submit" name="" value="Перемножить"><br>
    </form>
</body>
</html>

explode("\r\n", $key1);

READ ALSO
Область хранения сессии и куки

Область хранения сессии и куки

Когда создаётся куки setcookie("Cookie", "123"); Значение "123" хранится в браузере пользователя и занимает несколько байтов памяти компьютераЕсли же создаётся...

190
PHP 5 jsoon_encode проблема с кирилицей режет код

PHP 5 jsoon_encode проблема с кирилицей режет код

В php собираются данные и затем выводятся в json_encode в json строку, но вот беда он режет код после большого количества json символов кириллицы

223
Для чего используется QTreeWidgetItem::setData

Для чего используется QTreeWidgetItem::setData

Для чего нам нужен QTreeWidgetItem::setData(int column, int role, const QVariant & value), если в результате отображение данных всё равно текстовом формате? Пример использования:

282
Тип всего выражения

Тип всего выражения

Недавно написал такую функцию:

182