Solem 0 Denunciar post Postado Outubro 5, 2015 Estava querendo usar o lib_gg_orgchart (http://librerias.logicas.org/lib_gg_orgchart/) para montar um organograma. O problema é que ele usa como base um arquivo .JSON com o seguinte formato... http://librerias.logicas.org/lib_gg_orgchart/examples/demo-alltypes.json Como não serei eu que vou montar e fazer a manutenção dos mesmos, gostaria de usar um CSV simples no formato abaixo para a partir dele, gerar o organograma. (usei esse csv com o google orgchart e funciona bem, porém o do google não me dá muita liberdade de alteração de posicionamento das caixinhas) Basicamente no CSV tenho o seguinte... onde A seria o root, BB, CC e DD ligados a A, EEE e FFF ligados a BB e assim por diante A BB A CC A DD A EEE BB FFF BB GGG CC HHH CC III DD JJJ DD O problema que eu não conheço muito php e array multidimensional e não consegui em hipotese alguma gerar o JSON a partir do CSV. Tentei alguma recursão que não deu certo, ler debaixo pra cima, ler só os filhos. Sei lá... sei que não deu em nada. Se puderem ajudar, agradeço muito. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Outubro 6, 2015 Você pode usar fgetcsv para pegar cada linha do arquivo. A função já retorna um array. Então basta alimentar um array principal com cada um dos arrays retornados por fgetcsv. Depois, use json_encode para transformar o array em JSON Compartilhar este post Link para o post Compartilhar em outros sites
Solem 0 Denunciar post Postado Outubro 6, 2015 Você pode usar fgetcsv para pegar cada linha do arquivo. A função já retorna um array. Então basta alimentar um array principal com cada um dos arrays retornados por fgetcsv. Depois, use json_encode para transformar o array em JSON Então, é essa parte que não consigo implementar... Penso que pra montar aquele esquema ao ler o A devia procurar de quem ele é pai, ao ler o BB, já teria que procurar os filhos dele, e assim por diante... mas o problema é montar isso, não tenho conseguido juntar as informações em um array principal, pois só consigo ver isso funcionando de forma recursiva. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Outubro 6, 2015 Dá pra fazer com função recursiva, se quiser, mas acho desnecessário. É mais fácil ler o arquivo de forma sequencial (fgetcsv moverá o ponteiro; se fosse usar recursão, precisaria de fseek sempre antes de fgetcsv). O array principal é o array criado fora do loop (ou da função recursiva, se preferir assim) Sempre que houver só um elemento no array retornado por fgetcsv, significa que é um elemento-raiz. Portante, defina-o como chave do array principal. Quando houver mais de um no array, o último é a raiz. Logo, basta acrescentar no array: $array[$raiz][] = $elementos_menos_o_ultimo; No final, $array terá a hierarquia montada Compartilhar este post Link para o post Compartilhar em outros sites
Solem 0 Denunciar post Postado Outubro 6, 2015 Dá pra fazer com função recursiva, se quiser, mas acho desnecessário. É mais fácil ler o arquivo de forma sequencial (fgetcsv moverá o ponteiro; se fosse usar recursão, precisaria de fseek sempre antes de fgetcsv). O array principal é o array criado fora do loop (ou da função recursiva, se preferir assim) Sempre que houver só um elemento no array retornado por fgetcsv, significa que é um elemento-raiz. Portante, defina-o como chave do array principal. Quando houver mais de um no array, o último é a raiz. Logo, basta acrescentar no array: $array[$raiz][] = $elementos_menos_o_ultimo; No final, $array terá a hierarquia montada O problema é eu conseguir deixar na hierarquia definida lá no arquivo. Do modo que vc falou ficaria uma coisa assim: {"":[null],"A":["BB","CC","DD"],"BB":["EEE","FFF"],"CC":["GGG","HHH"],"DD":["III","JJJ"]} Só que não está correto, pois os filhos de BB tem que estar logo depois do nó BB, teria que sair algo assim: {"":[null],"A":["BB":["EEE","FFF],"CC":["GGG","HHH"],"DD":["III","JJJ"]]} Se ler sequencial não consigo essa profundidade. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Outubro 6, 2015 Ah, entendi o problema. Nesse caso, você não quer um array. Você precisa de uma outra Estrutura de Dados: a famosa Árvore :) Compartilhar este post Link para o post Compartilhar em outros sites
hufersil 145 Denunciar post Postado Outubro 8, 2015 Acho que isto resolve seu problema. $csv = 'XPTO TESTE;XPTO TESTE 2;XPTO TESTE 3;TESTE 2 TESTE 4;TESTE 2 TESTE 5;TESTE 3 TESTE 6;TESTE'; $lista = array(); foreach(explode("\n", $csv) as $value) { $pair = str_getcsv($value,";"); if(count($pair) == 1) { $pair[1] = null; } $lista[] = $pair; } $master = 0; $slave = 1; $newProp = 'children'; $flat = array(); foreach ($lista as & $item) { $flat[$item[$master]] =& $item; } foreach ($flat as & $node) { if (!empty($node[$slave])) { $flat[$node[$slave]][$newProp][] =& $node; } } $novo = array(); foreach ($flat as $idx => $first) { if (empty($first[$slave])) { $novo[] = $first; } } echo '<pre>'; print_r($novo); Compartilhar este post Link para o post Compartilhar em outros sites