Как повторно объявить переменную 0 в начале нового пространственного цикла PHP

Мой массив генерируется компромисс js, превращается в переменную JSON с использованием var json = JSON.stringify(tags);, перенесенного в вызове AJAX data:{json:json} в метод POST, файл PHPajax.php.

Вот как выглядит ajax.php

$json = $_POST['json'];

$data = json_decode($json, true);

И вот $data ...

echo '<pre>';
print_r($data);
echo '</pre>';

. . .

Array
(
    [0] => Array
        (
            [text] => the
            [normal] => the
            [tags] => Array
                (
                    [0] => Determiner
                )

        )

    [1] => Array
        (
            [text] => quick
            [normal] => quick
            [tags] => Array
                (
                    [0] => Comparable
                    [1] => Adjective
                )

        )

    [2] => Array
        (
            [text] => brown
            [normal] => brown
            [tags] => Array
                (
                    [0] => Comparable
                    [1] => Adjective
                )

        )

    [3] => Array
        (
            [text] => fox
            [normal] => fox
            [tags] => Array
                (
                    [0] => Noun
                    [1] => Singular
                )

        )

    [4] => Array
        (
            [text] => jumped
            [normal] => jumped
            [tags] => Array
                (
                    [0] => PastTense
                    [1] => Verb
                    [2] => VerbPhrase
                )

        )

    [5] => Array
        (
            [text] => over
            [normal] => over
            [tags] => Array
                (
                    [0] => Adjective
                )

        )

    [6] => Array
        (
            [text] => the
            [normal] => the
            [tags] => Array
                (
                    [0] => Determiner
                )

        )

    [7] => Array
        (
            [text] => lazy
            [normal] => lazy
            [tags] => Array
                (
                    [0] => Adjective
                )

        )

    [8] => Array
        (
            [text] => dog
            [normal] => dog
            [tags] => Array
                (
                    [0] => Noun
                    [1] => Singular
                )

        )

)

Вот как я хочу, чтобы массив выглядел ...

Expected Result

Array
(
    [the] => Array
        (
            [0] => Determiner
        )

    [quick] => Array
        (
            [0] => Comparable
            [1] => Adjective
        )

    [brown] => Array
        (
            [0] => Comparable
            [1] => Adjective
        )

    [fox] => Array
        (
            [0] => Noun
            [1] => Singular
        )
)

И моя попытка сделать это:

$tags = array();
$x = 0;
foreach ($data as $key => $value) {
    $tags[$value['normal']] = array();
for ($i=0;$i<count($value['tags']);$i++) {
    $tags[$x] = $value['tags'][$i];
    $x++;
}
}

Это выводит массив, аналогичный тому, что я хочу, но индекс $x автоматически увеличивается в начале массива, а не в каждом новом массиве в массиве.

Array
(
    [the] => Array
        (
        )

    [0] => Determiner
    [quick] => Array
        (
        )

    [1] => Comparable
    [2] => Adjective
    [brown] => Array
        (
        )

    [3] => Comparable
    [4] => Adjective
    [fox] => Array
        (
        )

    [5] => Noun
    [6] => Singular
    [jumped] => Array
        (
        )

    [7] => PastTense
    [8] => Verb
    [9] => VerbPhrase
    [over] => Array
        (
        )

    [10] => Adjective
    [11] => Determiner
    [lazy] => Array
        (
        )

    [12] => Adjective
    [dog] => Array
        (
        )

    [13] => Noun
    [14] => Singular
)

Все, что угодно, кроме этого, помещая $x в разные места в начале и в конце цикла foreach, я пробовал использовать array_values($tags[$value['normal']]); в конце цикла foreach в начале цикла for, пробуя это с помощью $ i в цикле for

for ($i=0;$i<count($value['tags']);$i++) {
    $tags[$i] = $value['tags'][$i];
}

Просто вызывает хаос в массиве

Array
(
    [the] => Array
        (
        )

    [0] => Noun
    [quick] => Array
        (
        )

    [1] => Singular
    [brown] => Array
        (
        )

    [fox] => Array
        (
        )

    [jumped] => Array
        (
        )

    [2] => VerbPhrase
    [over] => Array
        (
        )

    [lazy] => Array
        (
        )

    [dog] => Array
        (
        )

)

Каков правильный синтаксис для достижения ожидаемого результата, указанного выше?

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

Ответы 3

Ответ принят как подходящий

Как насчет array_reduce() с операция объединения массивов ...

$tags = array_reduce($data, function($carry, $item) {
    return $carry + [$item['normal'] => $item['tags']];
}, []);

Демо ~ https://eval.in/992451


Следует иметь в виду, что вы не указали, что должно происходить с повторяющимися записями (например, "the"). Оператор объединения массивов будет отдавать предпочтение первой записи и отбрасывать остальные. Это нормально для вашего примера, потому что каждое повторяющееся слово имеет идентичные теги, но если нет, вы можете придумать стратегию для слияния содержимого tags.

Да, я просто думал и смотрел на это. Есть ли способ с помощью array_reduce (кстати, никогда не слышал об этом, выводит именно так, как я хотел), чтобы добавить индексы в массив? имеется ввиду вместо Array ( [key] и попадание в ключ, что-то вроде Array ( [0] => Array ( [key] => Array. . .

Brian Bruman 23.04.2018 02:50

@BrianBruman не уверен, что вы имеете в виду. Если желаемый результат в вашем вопросе на самом деле не то, что вы хотите, тогда почему он в вашем вопросе?

Phil 23.04.2018 02:52

Я не думал о повторяющихся ключах, а просто пытался понять, как построить массив

Brian Bruman 23.04.2018 02:57

Я приму ваш ответ, поскольку у вас был очень чистый метод для моего ожидаемого результата, но что касается дублирующей ключевой проблемы, то @Schien также заслуживает принятого ответа.

Brian Bruman 23.04.2018 03:03

@BrianBruman, вы вообще не указали, что должно происходить с повторяющимися записями, так как же кто-то может это исправить?

Phil 23.04.2018 03:17

Я уже принял ваш ответ и никто другой. Я понимаю, что ошибся в предварительном обдумывании кода, но, как я объяснил, эта мысль не приходила мне в голову во время написания. Не знаю, как еще вы бы хотели, чтобы я ответил.

Brian Bruman 23.04.2018 03:29

@BrianBruman Если один из других ответов предоставляет решение, которое вы действительно хотите, вы всегда можете изменить свой выбор "принимать". Вы также можете отредактировать свой вопрос, если ваши требования отличаются от того, что вы написали

Phil 23.04.2018 03:31

Я действительно хотел бы знать, есть ли в вашей демонстрации eval.in инструмент для создания массивов вручную (он же $data). Я бы хотел возиться с массивами, не вдаваясь в процесс их создания, но этот процесс кажется утомительным. Это мой актуальный вопрос.

Brian Bruman 23.04.2018 03:37

Ваш неожиданный массив содержит всю необходимую информацию для ожидаемого массива. Итак, мы можем сделать некоторую трансформацию:

$data=json_decode($json_data,true);

$terms=array();
foreach ($data as $rec){
  $text=$rec['text'];
  $tags=$rec['tags'];
  if (!is_array($terms[$text])) $terms[$text]=array();
  foreach ($tags as $tag) $terms[$text][$tag]=$tag;
}

Обновлено: вместо [0] => Tag 1, [1] => Tag 2, ... теперь массив также хранит теги в ключах:

  [Tag 1]=>"Tag 1",
  [Tag 2]=>"Tag 2"

Это упрощенный способ избежать дублирования. Если вы действительно настаиваете на получении числового индекса, вы можете использовать array_values ​​во время поиска.

Это приведет к тому, что повторяющиеся записи (например, "the") будут иметь несколько идентичных тегов, например ['Determiner', 'Determiner'].

Phil 23.04.2018 02:48

Я отредактировал ответ, чтобы избежать дублирования. Этот метод быстрее, чем вызов in_array.

Schien 23.04.2018 02:52

Интересный подход! Спасибо, просмотрели. Я получаю уведомление: Undefined index: dog in C:\wamp64\www\N\ajax.php on line 11 (строка if (!is_array($terms[$text])) $terms[$text]=array();, которую я пытаюсь выяснить, но она хорошо выводит

Brian Bruman 23.04.2018 02:58

@BrianBruman, это потому, что это не позволяет проверить, существует ли $terms[$text], прежде чем использовать его в is_array()

Phil 23.04.2018 03:19

Простой цикл foreach может делать то, что вам нравится

$json = $_POST['json'];
$data = json_decode($json, true);

$result = []; // Initialize output array
foreach ($data as $array) {
    $result[] = array($array['text'] => $array['tags']);
}

echo '<pre>';
print_r($result);

Ха! Собственно, это должен быть принятый ответ :)! Результат идеален: pastebin.com/pbb4y96F, и код выглядит так просто. Собираюсь использовать это

Brian Bruman 23.04.2018 03:06

@BrianBruman, но это не ожидаемый результат из вашего вопроса

Phil 23.04.2018 03:16

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