Помощь в преобразовании строки json
Всем добрый день, уже неделю не могу составить правильно скрипт, который преобразует json строку.
Вот исходная строка Код:
[{"id":"1","name":"Киевский","surname":"Дмитрий","id_fat":"3","id_mot":"2"}, Код:
{ |
Написал код, но он не так как надо работает...
$(document).ready(function(){ var foo =[{"id":"1","name":"Киевский","surname":"Дмитрий","id_fat":"3","id_mot":"2"},{"id":"2","name":"Ращупкина","surname":"Елизавета","id_fat":"7","id_mot":"0"},{"id":"3","name":"Киевский","surname":"Владимир","id_fat":"6","id_mot":"5"},{"id":"4","name":"Третьяков","surname":"Антон","id_fat":"3","id_mot":"2"},{"id":"5","name":"","surname":"Галина","id_fat":"0","id_mot":"0"},{"id":"6","name":"Киевский","surname":"Дмитрий","id_fat":"0","id_mot":"0"},{"id":"7","name":"Ращупкин","surname":"Виталий","id_fat":"0","id_mot":"0"}]; //console.log(foo[0].nom) string = "" for(i=0;i<foo.length;i++){ namef = ''; namem = ''; if(foo[i].id_fat != 0 || foo[i].id_mot != 0){ idf = foo[i].id_fat; idm = foo[i].id_mot; for(j=0;j<foo.length;j++){ if(foo[j].id == idf){ namef = foo[j].name+' '+foo[j].surname } if(foo[j].id == idm){ namem = foo[j].name+' '+foo[j].surname console.log(namem) } } console.log(foo[i].id+' '+foo[i].name+' '+foo[i].surname+' '+namef+' '+namem) string = string + '{"name":"'+foo[i].name+' '+foo[i].surname+'","children": [{"name": "'+namef+'"}, {"name": "'+namem+'"}],}' } } console.log(string) }) |
вам такой результат нужен?
[{ "name": "Киевский Дмитрий", "parent": [{ "name": "Киевский Владимир" }, { "name": "Ращупкина Елизавета" }] }, { "name": "Ращупкина Елизавета", "parent": [{ "name": "Ращупкин Виталий" }] }, { "name": "Киевский Владимир", "parent": [{ "name": "Киевский Дмитрий" }, { "name": " Галина" }] }, { "name": "Третьяков Антон", "parent": [{ "name": "Киевский Владимир" }, { "name": "Ращупкина Елизавета" }] }, { "name": " Галина", "parent": [] }, { "name": "Киевский Дмитрий", "parent": [] }, { "name": "Ращупкин Виталий", "parent": [] }] |
Нет, тут нужно родителей запихать внутрь.
{ "name": "Киевский Дмитрий", "parent": [{ "name": "Киевский Владимир", "parent": [{ "name": "Киевский Дмитрий " }, { "name": "Галина" }] },{ "name": "Ращупкина Елизавета", "parent": [{ "name": "Ращупкин Виталий" }] }] } вот так... просто исходную строку я плучаю с помощью пхп скрипта, а преобразую ее в js. |
Цитата:
|
dimke931,
то есть вам нужно построить дерево :) |
Цитата:
|
Цитата:
|
Цитата:
echo '<pre>'; $s = json_decode('[{"id":"1","name":"Киевский","surname":"Дмитрий","id_fat":"3","id_mot":"2"}, {"id":"2","name":"Ращупкина","surname":"Елизавета","id_fat":"7","id_mot":"0"}, {"id":"3","name":"Киевский","surname":"Владимир","id_fat":"6","id_mot":"5"}, {"id":"5","name":"","surname":"Галина","id_fat":"0","id_mot":"0"}, {"id":"6","name":"Киевский","surname":"Дмитрий","id_fat":"0","id_mot":"0"}, {"id":"7","name":"Ращупкин","surname":"Виталий","id_fat":"0","id_mot":"0"}]', 1); echo json_encode($s, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_NUMERIC_CHECK); Параметр JSON_PRETTY_PRINT как раз и вернет форматируемый как есть. |
Цитата:
|
Какая рекурсия, если:
Array ( [0] => Array ( [id] => 1 [name] => Киевский [surname] => Дмитрий [id_fat] => 3 [id_mot] => 2 ) [1] => Array ( [id] => 2 [name] => Ращупкина [surname] => Елизавета [id_fat] => 7 [id_mot] => 0 ) С чего вдруг: "name": "Киевский Дмитрий", "parent": [{ "name": "Киевский Владимир", "parent": [{ "parent", которого нет в исходном? И не проще ли организовать на сервере из исходного массива средствами РНР массив такой структуры, в котором все будет так как вам нужно, и только потом json_encode? И для этого вряд ли рекурсия потребуется. |
Цитата:
Но средствами PHP я еще не думал как реализовать, т.к. если в js я еще что то могу попробовать реализовать то с PHP я без понятия:) |
<?php /////////////////////// // декодируем русские символы function jdecoder($json_str) { $cyr_chars = array ( '\u0430' => 'а', '\u0410' => 'А', '\u0431' => 'б', '\u0411' => 'Б', '\u0432' => 'в', '\u0412' => 'В', '\u0433' => 'г', '\u0413' => 'Г', '\u0434' => 'д', '\u0414' => 'Д', '\u0435' => 'е', '\u0415' => 'Е', '\u0451' => 'ё', '\u0401' => 'Ё', '\u0436' => 'ж', '\u0416' => 'Ж', '\u0437' => 'з', '\u0417' => 'З', '\u0438' => 'и', '\u0418' => 'И', '\u0439' => 'й', '\u0419' => 'Й', '\u043a' => 'к', '\u041a' => 'К', '\u043b' => 'л', '\u041b' => 'Л', '\u043c' => 'м', '\u041c' => 'М', '\u043d' => 'н', '\u041d' => 'Н', '\u043e' => 'о', '\u041e' => 'О', '\u043f' => 'п', '\u041f' => 'П', '\u0440' => 'р', '\u0420' => 'Р', '\u0441' => 'с', '\u0421' => 'С', '\u0442' => 'т', '\u0422' => 'Т', '\u0443' => 'у', '\u0423' => 'У', '\u0444' => 'ф', '\u0424' => 'Ф', '\u0445' => 'х', '\u0425' => 'Х', '\u0446' => 'ц', '\u0426' => 'Ц', '\u0447' => 'ч', '\u0427' => 'Ч', '\u0448' => 'ш', '\u0428' => 'Ш', '\u0449' => 'щ', '\u0429' => 'Щ', '\u044a' => 'ъ', '\u042a' => 'Ъ', '\u044b' => 'ы', '\u042b' => 'Ы', '\u044c' => 'ь', '\u042c' => 'Ь', '\u044d' => 'э', '\u042d' => 'Э', '\u044e' => 'ю', '\u042e' => 'Ю', '\u044f' => 'я', '\u042f' => 'Я', '\r' => '', '\n' => '<br />', '\t' => '' ); foreach ($cyr_chars as $key => $value) { $json_str = str_replace($key, $value, $json_str); } return $json_str; } //////////////////////// $data = array(); // в этот массив запишем то, что выберем из базы $ta = mysql_query("select id_indi as id, nom as name, prenom1 as surname, ifnull(id_pere,0) as id_fat, ifnull(id_mere,0) as id_mot from got_".$_REQUEST['ibase']."_individu "); // сделаем запрос в БД while($row = mysql_fetch_assoc($ta)){ // оформим каждую строку результата // как ассоциативный массив $data[] = $row; // допишем строку из выборки как новый элемент результирующего массива } echo jdecoder(json_encode($data)); // и отдаём как json ?> в данный момент я получаю свою json строку так |
Что значит без понятия? Вот я например не могу понять (и это никоим образом ни к какому языку программирования не относится, это чисто логический вывод) - как такое может быть?: "name": "Киевский Дмитрий", этот же "Киевский Дмитрий" является для "Киевского Дмитрия" родителем: "parent": [{"name": "Киевский Дмитрий"...
Это как понимать? Это не дерево фамильное, это жертвы Чернобыльской трагедии. :) |
jdecoder(json_encode($data)) - а что за версия РНР используется? Может пора перелазить как минимум на 5.4 и jdecoder() в помойку?
|
Ох, я и забыл про это тут весь прикол что это два разных Дмитрия Киевских (внук и дед) (простите за то что не объяснил сразу)... а вот про версию php... такая стоит изначально на денвере... хотя это может быть повод перелезть на опен сервер
|
версия php 5.3.13
|
Давно пора перелезть на Open Server и подключать в нем ту версию, которая будет на реальном сервере. Денвер давно помер.
Что касается вывода из базы и построения дерева, и при этом есть дед с внуком, и дед в базе как "родитель" внука, то запрос не верный. Если его сделать правильно, как и выбирается дерево, и можно без всяких рекурсий, то потом можно из результата построить дерево, но оно никак не будет таким, это неверное представление. А уж потом jsoan_encode(). |
Цитата:
|
![]() вот графическое изображение этого самого дерева |
А мне вот интересно, т.к. этот проект 2014 года и я подрублю все это на свежую версию php не будет ли ошибок?)
|
То есть вершина дерева это потомок? И как оно в базе описывается? Какова максимальная глубина вложения может быть?
|
Цитата:
в базу данных каждая персона имеет ссылку на id отца и матери |
Цитата:
|
В MySQL это описывается так...
![]() изначально это была французская разработка, но я решил ее допилить и познать web как бы на примерах. то есть тут есть id_indi как id персоны и id_pere как id отца и id_mere как id матери на 4 id пока не обращайте внимание, он пока тут не фигурирует) я хочу потом сделать так, что бы если ид родителей одинаковые то записывать их в одну ячейку |
Цитата:
В общем нужно видеть представление базы, ее структуру, но запрос делается не верно, это 100% точно. |
Цитата:
|
Картинки не дают никакого представления о структуре базы - как связываются между собой родитель <-> потомок и потомок <-> родитель.
|
Цитата:
|
Цитата:
![]() сами связи дополнительно хранятся отдельно :) |
Цитата:
|
Цитата:
|
Цитата:
|
CREATE TABLE `got_kievsky_even_sour` ( `id_indi` mediumint(9) NOT NULL DEFAULT '0', `id_husb` mediumint(9) NOT NULL DEFAULT '0', `id_wife` mediumint(9) NOT NULL DEFAULT '0', `type_evene` varchar(4) NOT NULL, `date_evene` varchar(32) DEFAULT NULL, `lieu_evene` varchar(42) DEFAULT NULL, `dept_evene` varchar(42) DEFAULT NULL, `id_sour` mediumint(9) NOT NULL DEFAULT '0', `type_sourc` varchar(4) NOT NULL, `attr_sourc` varchar(255) DEFAULT NULL, KEY `FK1_INDI` (`id_indi`,`type_evene`), KEY `FK2_HUSB` (`id_husb`,`type_evene`), KEY `FK3_WIFE` (`id_wife`,`type_evene`), KEY `FK4_SOUR` (`id_sour`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; # TC`got_kievsky_evenement`utf8_general_ci ; CREATE TABLE `got_kievsky_evenement` ( `id_indi` mediumint(9) NOT NULL DEFAULT '0', `id_husb` mediumint(9) NOT NULL DEFAULT '0', `id_wife` mediumint(9) NOT NULL DEFAULT '0', `type_evene` varchar(4) NOT NULL, `date_evene` varchar(32) DEFAULT NULL, `lieu_evene` varchar(42) DEFAULT NULL, `dept_evene` varchar(42) DEFAULT NULL, `note_evene` mediumtext, `anne_evene` smallint(6) DEFAULT NULL, KEY `FK1_INDI` (`id_indi`), KEY `FK2_HUSB` (`id_husb`), KEY `FK3_WIFE` (`id_wife`), KEY `FK4_LIEU` (`lieu_evene`), KEY `FK5_TYPE` (`type_evene`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; # TC`got_kievsky_individu`utf8_general_ci ; CREATE TABLE `got_kievsky_individu` ( `id_indi` int(9) NOT NULL DEFAULT '0', `nom` varchar(32) DEFAULT NULL, `prenom1` varchar(32) DEFAULT NULL, `prenom2` varchar(32) DEFAULT NULL, `prenom3` varchar(32) DEFAULT NULL, `sexe` tinytext, `profession` varchar(42) DEFAULT NULL, `date_naiss` varchar(32) DEFAULT NULL, `lieu_naiss` varchar(42) DEFAULT NULL, `dept_naiss` varchar(42) DEFAULT NULL, `date_deces` varchar(32) DEFAULT NULL, `lieu_deces` varchar(42) DEFAULT NULL, `dept_deces` varchar(42) DEFAULT NULL, `note_indi` text, `id_pere` mediumint(9) DEFAULT NULL, `id_mere` mediumint(9) DEFAULT NULL, `tri` smallint(6) DEFAULT NULL, `sosa_dyn` bigint(20) DEFAULT NULL, `anne_deces` smallint(6) DEFAULT NULL, PRIMARY KEY (`id_indi`), KEY `FK1_NOM` (`nom`), KEY `FK2_PREN` (`prenom1`), KEY `FK3_PERE` (`id_pere`), KEY `FK4_MERE` (`id_mere`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; # TC`got_kievsky_relation`utf8_general_ci ; CREATE TABLE `got_kievsky_relation` ( `id_parent` mediumint(9) NOT NULL DEFAULT '0', `id_enfant` mediumint(9) NOT NULL DEFAULT '0', `type_parent` char(1) DEFAULT NULL, PRIMARY KEY (`id_parent`,`id_enfant`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; # TC`got_kievsky_source`utf8_general_ci ; CREATE TABLE `got_kievsky_source` ( `id_sour` mediumint(9) NOT NULL DEFAULT '0', `note_source` mediumtext, PRIMARY KEY (`id_sour`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; вот я сделал дамп таблиц |
Я только не как не могу понять, почему мне не выдает связей... ведь они должны быть...
|
Код:
CREATE TABLE `got_kievsky_relation` ( |
Цитата:
|
Цитата:
"select id_indi as id, nom as name, prenom1 as surname, ifnull(id_pere,0) as id_fat, ifnull(id_mere,0) as id_mot from got_".$_REQUEST['ibase']."_individu " |
Цитата:
|
мы делали в erwin концептуальную модель - а не шаляй валяй. ) Ну а запрос ваш, это же просто запрос к одной таблице для получения указанных полей и все, без всякой концепции, то бишь углубленной задачи.
Совет, хотя можете его и не воспринимать - не пишите в запросах имена полей и названия функций в одном регистре, плохо читается такой запрос. Лучше так: $sql = 'SELECT id_indi AS id, nom name, prenom1 surname, ifnull(id_pere,0) id_fat, ifnull(id_mere,0) id_mot FROM got_'.$_REQUEST['ibase'].'_individu'; AS указан только раз, ибо уж не помню с какой версии его можно опускать. А вот это - got_' . $_REQUEST['ibase'] . '_individu - не допустимо. Нет времени сейчас, а выбор из таблицы дерева, это извечный вопрос, и о нем уже столько переписано. Есть такой подход: NESTED SETS есть и иные. Могу добавить, по секрету, что можно вообще сформировать строку запроса, выполнить один запрос и получить дерево, и тоже без рекурсий. Только одно условие для этого нужно - ограничение максимального вложения какой либо величиной. |
Часовой пояс GMT +3, время: 06:59. |