Массив объектов PHP в ассоциативный массив javascript

У меня есть массив объектов 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", … }

Как я могу это исправить?

Невозможно, JavaScript не поддерживает ассоциативные массивы. Однако целевой объект в примере возможен.

Teemu 15.06.2018 08:58

Попробуй этот json_encode($chars, true)

Jacek B Budzynski 15.06.2018 08:58

@ Teemu: У меня вопрос, в целевом формате я хочу даже ассоциативный массив. Это для плагина easyautocomplete. Это представление JSON?

Inception 15.06.2018 09:00

Нет, это не ассоциативный массив, по крайней мере, не в том смысле, в каком этот термин означает в PHP. Это объект JavaScript, а не «объект JSON». Вы вполне можете сделать то, что сказал Яцек, это тривиальная задача - преобразовать строку JSON в объект JavaScript на стороне клиента.

Teemu 15.06.2018 09:03

Предложение Яцека по какой-то причине не имело никакого значения. Мне все еще нужно выяснить, как преобразовать мои данные в этот формат для плагина easyautocomplete :(

Inception 15.06.2018 09:08

@Teemu js_data - это массив объектов, каждый из которых содержит свойство id и name. 0: Object { id: "10", name: "Cyclops", … } ​​ 1: Object { id: "11", name: "Professor X", … } Я хочу, чтобы все это вошло в свойство data переменной character, как я поместил в свой исходный пост.

Inception 15.06.2018 09:19

Но разве только var characters = {data: JSON.parse(JSON.stringify(js_data))}; не сделает то, что вам нужно? Или еще проще: var characters = {data: js_data};, если исходный объект данных в дальнейшем не понадобится.

Teemu 15.06.2018 09:28

Но когда я это делаю, кажется, что каждое значение внутри данных - это объект, содержащий имя и идентификатор, а не просто имя и идентификатор. i.imgur.com/WcmV2ll.png

Inception 15.06.2018 09:32

?? Вот что должно быть, как я уже сказал, в JS нет ассоциативных массивов. Это тоже то, что, по вашему мнению, вам нужно: characters = {data: [{"name": "Cyclops", id: 10}, ... ]}.

Teemu 15.06.2018 09:45

@Teemu Но проблема в том, что плагин затем выдает объекты в качестве предложений: i.imgur.com/wMT1PBj.png

Inception 15.06.2018 09:51

Затем вы должны проверить, что вам действительно нужно. Что должен предложить плагин? Имена или идентификаторы или и то, и другое?

Teemu 15.06.2018 09:52

Из мануала к плагину: i.imgur.com/EW2m09Z.png

Inception 15.06.2018 09:55

Ладно, просто вы попросили преобразовать в форму, которая на самом деле не нужна. Те, кто уже публиковал ответы, наверняка могут ответить и на этот вопрос. Пожалуйста, свяжитесь с обоими ответчиками, чтобы узнать об изменении вопроса.

Teemu 15.06.2018 09:57

Спасибо. Кажется, я все время просил неправильное решение. Я очень сожалею об этом.

Inception 15.06.2018 09:59

Не волнуйтесь, вы не первый, кто спросил то, что им на самом деле не нужно =).

Teemu 15.06.2018 10:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
15
1 502
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это не самая сложная задача, так как у вас почти есть желаемый формат. Сначала я должен добавить, что вам, возможно, даже не нужно фильтровать поле адреса, поскольку плагин может полностью его игнорировать. Если это так, вы можете просто сделать это

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.

Inception 15.06.2018 09:44

Это то, что вы хотите? pastebin.com/yPS8TnuZ Я добавил соответствующую часть html / js / php, а внизу - выходы console.info и var_dump.

Inception 15.06.2018 10:34

В приведенной выше вставке игнорируйте небольшое несоответствие имени идентификатора, я уже исправил его.

Inception 15.06.2018 10:35

Вы можете преобразовать последний массив 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

Anuragh KP 15.06.2018 11:55

Другие вопросы по теме