PHP получает значение объекта JSON из входного массива (массивоподобное имя)

#php #arrays #json #string

#php #массивы #json #строка

Вопрос:

У меня есть 3 таких входа:

 <input type="text" name="product[1][name]" >
<input type="text" name="product[1][cost]" >
<input type="text" name="product[1][qty]"  >
 

… который продолжается до n продуктов

 <input type="text" name="product[n][name]" >
<input type="text" name="product[n][cost]" >
<input type="text" name="product[n][qty]"  >
 

и на основе входного значения создается строка JSON, подобная этой:

 {"product[1][name]": "Prod1", "product[1][cost]": "100$", "product[1][qty]": "3", "product[2][name]": "Prod2", ... }
 

как я могу получить их имя и значение, потому что ни json_decode одна функция не может принимать их значения из-за имени, подобного массиву

 $decodedObject=json_decode($array['data']); // this data contains the json string
echo $decodedObject->product; // does not work
echo $decodedObject->product[1][qty]; // does not work
 

есть ли какой-нибудь простой способ?
Или единственный способ — вырезать имя, например product[ , взять внутренние элементы и значение после : и так далее?

Но как я могу даже извлечь из него объект, не сообщая PHP, что это не массив?

Комментарии:

1. Как вы создаете этот JSON?

2. @El_Vanja JSON создается из формы, каждый ввод формы берется и преобразуется в строку JSON, а затем загружается в базу данных. Я хочу получить «product [x] [name]» из этой строки JSON, которую я возьму из базы данных.

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

4. @Alex. Я отправляю данные формы в AJAX-скрипт, который вставляет их в базу данных как тип данных VARCHAR, если это был вопрос 🙂

5. @Lepy Почему вы хотите сделать его JSON, а затем отправить на сервер? Почему бы просто не сделать сообщение в форме HTML?

Ответ №1:

Сначала я нашел альтернативу. Проблема в том, что это:

 $decodedObject=json_decode($array['data']); // will create an object
 

не будет преобразовывать его в массив, вместо этого я использовал это:

 $decodedObject=json_decode($array['data'], true); // will create an array 
 

после этого я проверил, сколько объектов существует, а затем просто добавил их в другой массив:

 $i=1;
while(isset($decodedObject["product[$i][qty]"])) // while any element exists
{
    $newProducs= array();
    $newProducs['name'] = $decodedObject["product[$i][name]"];
    $newProducs['cost'] = $decodedObject["product[$i][cost]"];
    $newProducs['qty'] = $decodedObject["product[$i][qty]"];
    array_push($products, $newProducs); // optional: add to the main array (products) the new-created array (newProducs)
    $i  ; //increment to search another product
}
 

Проблема заключалась в том, что я не полностью создавал массив -_-

Хотя это не полный ответ, я все же надеюсь, что кто-нибудь найдет лучшее решение, а не изменение.