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"}

Как это сделать? Спасибо!
  • Вопрос задан
  • 5753 просмотра
Пригласить эксперта
Ответы на вопрос 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);
Ответ написан
Ваш ответ на вопрос

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

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