Мой массив генерируется компромисс 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
(
)
)
Каков правильный синтаксис для достижения ожидаемого результата, указанного выше?






Как насчет array_reduce() с операция объединения массивов ...
$tags = array_reduce($data, function($carry, $item) {
return $carry + [$item['normal'] => $item['tags']];
}, []);
Демо ~ https://eval.in/992451
Следует иметь в виду, что вы не указали, что должно происходить с повторяющимися записями (например, "the"). Оператор объединения массивов будет отдавать предпочтение первой записи и отбрасывать остальные. Это нормально для вашего примера, потому что каждое повторяющееся слово имеет идентичные теги, но если нет, вы можете придумать стратегию для слияния содержимого tags.
@BrianBruman не уверен, что вы имеете в виду. Если желаемый результат в вашем вопросе на самом деле не то, что вы хотите, тогда почему он в вашем вопросе?
Я не думал о повторяющихся ключах, а просто пытался понять, как построить массив
Я приму ваш ответ, поскольку у вас был очень чистый метод для моего ожидаемого результата, но что касается дублирующей ключевой проблемы, то @Schien также заслуживает принятого ответа.
@BrianBruman, вы вообще не указали, что должно происходить с повторяющимися записями, так как же кто-то может это исправить?
Я уже принял ваш ответ и никто другой. Я понимаю, что ошибся в предварительном обдумывании кода, но, как я объяснил, эта мысль не приходила мне в голову во время написания. Не знаю, как еще вы бы хотели, чтобы я ответил.
@BrianBruman Если один из других ответов предоставляет решение, которое вы действительно хотите, вы всегда можете изменить свой выбор "принимать". Вы также можете отредактировать свой вопрос, если ваши требования отличаются от того, что вы написали
Я действительно хотел бы знать, есть ли в вашей демонстрации eval.in инструмент для создания массивов вручную (он же $data). Я бы хотел возиться с массивами, не вдаваясь в процесс их создания, но этот процесс кажется утомительным. Это мой актуальный вопрос.
Ваш неожиданный массив содержит всю необходимую информацию для ожидаемого массива. Итак, мы можем сделать некоторую трансформацию:
$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'].
Я отредактировал ответ, чтобы избежать дублирования. Этот метод быстрее, чем вызов in_array.
Интересный подход! Спасибо, просмотрели. Я получаю уведомление: Undefined index: dog in C:\wamp64\www\N\ajax.php on line 11 (строка if (!is_array($terms[$text])) $terms[$text]=array();, которую я пытаюсь выяснить, но она хорошо выводит
@BrianBruman, это потому, что это не позволяет проверить, существует ли $terms[$text], прежде чем использовать его в is_array()
Простой цикл 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, и код выглядит так просто. Собираюсь использовать это
@BrianBruman, но это не ожидаемый результат из вашего вопроса
Да, я просто думал и смотрел на это. Есть ли способ с помощью array_reduce (кстати, никогда не слышал об этом, выводит именно так, как я хотел), чтобы добавить индексы в массив? имеется ввиду вместо
Array ( [key]и попадание в ключ, что-то вродеArray ( [0] => Array ( [key] => Array. . .