Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Solem

CSV para JSON

Recommended Posts

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.