Задать вопрос
yramarad31
@yramarad31

Как правильно перекодировать массив php в json?

Из формы приходит такой массив (может быть неограниченных размеров (четное число)):
array(4) { 
["key"]=> string(4) "test" 
["value"]=> string(4) "test" 

["key2"]=> string(4) "test" 
["value2"]=> string(4) "test" 
}

Делаю так:
json_encode( $fields );
Получаю:
{"key":"test","value":"test","key2":"test","value2":"test"}

Нужно:
{"key":"brand","value":"Brand"},{"key":"storage","value":"Storage"},{"key":"touchscreen","value":"Touchscreen"}

Как это сделать? Спасибо!
  • Вопрос задан
  • 5771 просмотр
Подписаться 2 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Skillbox
    PHP-разработчик. Базовый уровень
    3 месяца
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Stepik
    PHP (pro)
    2 недели
    Далее
  • OTUS
    PHP Developer. Professional
    5 месяцев
    Далее
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Onskills
    PHP: базовый курс
    1 месяц
    Далее
Пригласить эксперта
Ответы на вопрос 3
@mib
Видимо вот такая форма html
<form method="POST">
<input type="text" name="key" value="test">
<input type="text" name="value" value="test">
<input type="text" name="key2" value="test">
<input type="text" name="value2" value="test">
</form>

и ничего другого, кроме как
{"key":"test","value":"test","key2":"test","value2":"test"}
не получится
Ну или нужно перефразировать вопрос
Ответ написан
Комментировать
Akdmeh
@Akdmeh
PHP, Yii2, Music
//старый массив
$array=['key'=>'test1', 'value'=>'value1', 'key2'=>'test2', 'value2'=>'value2'];
//нужно переформатировать массив, это будет новый
$new_arr=[];
for($i=1; true; $i++){
//Это чтобы первое значение было key, а не key1
$suffix=$i==1 ? '' : $i;
if(array_key_exists('key'.$suffix, $array) && array_key_exists('value'.$suffix, $array)){
//добавляем новое значение
    $new_arr[]=['key'=>$array['key'.$suffix], 'value'=>$array['value'.$suffix]];
} //если закончились массивы. Это в случае, если нумерация непрерывная, иначе стоит изменить именование полей в форме
else {break;}
}

echo json_encode($new_arr);


Это плохой неоптимизированный код, но я объяснил принцип. Но лучше посоветую именовать все поля в форме как key[] и value[].
Тогда их можно будет вытащить с помощью
foreach($_POST['key'] as $k=>$v) и переформатировать будет по-проще, типа так:
foreach($_POST['key'] as $k=>$v) {
$new_arr[]=['key'=>$v, 'value'=>$_POST['value'][$k]];
}


В данном коде вообще не учтена валидация полей на пустоту, xss-атаки и все прочее, имейте в виду.
Ответ написан
Комментировать
@username114683295
Разве, что можно получить такое, иначе меняй структуру массива:
{"1":{"key1":"value1"},"2":{"key2":"value2"}}

$some_array = array('key1'=>'value1','key2'=>'value2');
$i = 1;
$arr = array();
foreach($some_array as $key=>$value){
    $arr[$i][$key] = $value;
    $i++;
}
$some_json = json_encode($arr);
print_r($some_json);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы