У меня есть массив объектов PHP следующим образом:
array(223) {
[0]=>
object(stdClass)#5 (9) {
["id"]=>
string(2) "10"
["name"]=>
string(10) "Cyclops"
["address"]=>
string(13) "GSDG"
}
[1]=>
object(stdClass)#6 (9) {
["id"]=>
string(2) "11"
["name"]=>
string(11) "Professor X"
["address"]=>
string(8) "XX"
}
Мне нужно преобразовать его в массив javascript с именем и идентификатором в этом формате:
var characters = {
data: [{
"name": "Cyclops",
id: 10
},
{
"name": "Professor X",
id: 11
}
]
}
Вот что я пробовал:
Сначала я преобразовал массивы PHP в объекты javascript, а затем использовал цикл for для передачи деталей каждого массива в объект javascript:
var js_data = <?php echo json_encode($chars) ?>;
var characters = [];
for (var i = 0; i < js_data.length; i++) {
characters.push({
data: js_data[i]
})
}
Но в результате получается массив объектов, каждый из которых имеет свойство «данные». Вот console.info testVariable:
0: {…}
data: Object { id: "10", name: "Cyclops", … }
__proto__: Object { … }
1: {…}
data: Object { id: "11", name: "Professor X", … }
Как я могу это исправить?
Попробуй этот json_encode($chars, true)
@ Teemu: У меня вопрос, в целевом формате я хочу даже ассоциативный массив. Это для плагина easyautocomplete. Это представление JSON?
Нет, это не ассоциативный массив, по крайней мере, не в том смысле, в каком этот термин означает в PHP. Это объект JavaScript, а не «объект JSON». Вы вполне можете сделать то, что сказал Яцек, это тривиальная задача - преобразовать строку JSON в объект JavaScript на стороне клиента.
Предложение Яцека по какой-то причине не имело никакого значения. Мне все еще нужно выяснить, как преобразовать мои данные в этот формат для плагина easyautocomplete :(
@Teemu js_data - это массив объектов, каждый из которых содержит свойство id и name. 0: Object { id: "10", name: "Cyclops", … } 1: Object { id: "11", name: "Professor X", … } Я хочу, чтобы все это вошло в свойство data переменной character, как я поместил в свой исходный пост.
Но разве только var characters = {data: JSON.parse(JSON.stringify(js_data))}; не сделает то, что вам нужно? Или еще проще: var characters = {data: js_data};, если исходный объект данных в дальнейшем не понадобится.
Но когда я это делаю, кажется, что каждое значение внутри данных - это объект, содержащий имя и идентификатор, а не просто имя и идентификатор. i.imgur.com/WcmV2ll.png
?? Вот что должно быть, как я уже сказал, в JS нет ассоциативных массивов. Это тоже то, что, по вашему мнению, вам нужно: characters = {data: [{"name": "Cyclops", id: 10}, ... ]}.
@Teemu Но проблема в том, что плагин затем выдает объекты в качестве предложений: i.imgur.com/wMT1PBj.png
Затем вы должны проверить, что вам действительно нужно. Что должен предложить плагин? Имена или идентификаторы или и то, и другое?
Из мануала к плагину: i.imgur.com/EW2m09Z.png
Ладно, просто вы попросили преобразовать в форму, которая на самом деле не нужна. Те, кто уже публиковал ответы, наверняка могут ответить и на этот вопрос. Пожалуйста, свяжитесь с обоими ответчиками, чтобы узнать об изменении вопроса.
Спасибо. Кажется, я все время просил неправильное решение. Я очень сожалею об этом.
Не волнуйтесь, вы не первый, кто спросил то, что им на самом деле не нужно =).



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это не самая сложная задача, так как у вас почти есть желаемый формат. Сначала я должен добавить, что вам, возможно, даже не нужно фильтровать поле адреса, поскольку плагин может полностью его игнорировать. Если это так, вы можете просто сделать это
var characters = <?php json_encode(['data' => $chars]); ?>;
И если вам действительно нужно отфильтровать адресное поле, вы можете использовать array_map.
$chars = array_map(function($item) {
// at this point, you don't need an object, as json_encode do the
// same for objects and associative arrays
return [
"id" =>$item->id,
"name" => $item->name
];
}, $chars);
Когда я это делаю, кажется, что в переменную символов ничего не вводится. console.info ничего не возвращает для переменной characters.
Это то, что вы хотите? pastebin.com/yPS8TnuZ Я добавил соответствующую часть html / js / php, а внизу - выходы console.info и var_dump.
В приведенной выше вставке игнорируйте небольшое несоответствие имени идентификатора, я уже исправил его.
Вы можете преобразовать последний массив javascript JSON в
var characters = {
data: [{
"name": "Cyclops",
id: 10
},
{
"name": "Professor X",
id: 11
}
]
}
Используя результат вашего кода PHP
0: {…}
Взаимодействие с другими людьми data: Object {id: "10", name: "Cyclops",…} Взаимодействие с другими людьми прото: Объект {…} Взаимодействие с другими людьми 1: {…} Взаимодействие с другими людьми данные: Объект {id: "11", имя: "Профессор X",…}
Используйте необходимость сохранить окончательный результат ниже в переменной js, и вы можете использовать forEach, чтобы передать переменную в другой массив js, например если результат
var a=[{data:{id:"10",name:"Cyclops"}},{data:{id:"11",name:"Professor X"}}]
затем используйте
var b=[]
a.forEach(x=>{b.push(x.data)});
он получит результат ниже
(2) [{…}, {…}] 0 : {id: "10", name: "Cyclops"} 1 : {id: "11", name: "Professor X"} length : 2 proto : Array(0)
Я надеюсь это поможет тебе
можете ли вы предоставить образец переменной массива PHP
Невозможно, JavaScript не поддерживает ассоциативные массивы. Однако целевой объект в примере возможен.