php array converted to json does not maintain order in mysql

1

I have an array of the following format:

$vetor = array(

   1=>array(
      pt-BR => array(
       'pergunta1' => 'pergunta 1 em texto'
       'resposta1' => 'resposta 1 em texto'
         )
      )
   3=>array(
      pt-BR => array(
       'pergunta3' => 'pergunta 3 em texto'
       'resposta3' => 'resposta 3 em texto'
         )
      )
);

I am trying to write this array to a 'json' dynamic column in mysql 5.7. How can I keep order by putting question 3 before 1 and keeping that order?

    
asked by anonymous 03.07.2017 / 20:24

2 answers

0

It does not matter the order that is written, at the time of decoding (when doing SELECT and then using json_decode ) is likely to get lost again >, you do not have to worry about the moment of "saving", worry about the moment after "decode" to display, you can solve at the time of reading easily in for

$obj = json_decode($linha['dadosjsonnobanco'], true);

//Pega a maior chave no seu array
$higher = max(array_keys($obj));

for ($i = $higher; $i >= 0; $i--) {
     if (empty($obj[$i])) continue; //Se não existir um item pula para o proximo

     var_dump($obj[$i]);
}

See that instead of using ++ I invested, it is -- , so you start with the largest number, it starts for example at 3, then it goes to 2 and as 2 does not exist it fires continue; , then goes to 1 then to 0 , as 0 does not exist it ends for

    
06.07.2017 / 20:35
0

To sort a descending array you must use the krsort function, but this function keep the original keys. If you want to ensure this new order, you can use array_values to get a copy of the array with new keys.

$vetor = [
    1 => [
        'pt-BR' => [
            'pergunta1' => 'pergunta 1 em texto',
            'resposta1' => 'resposta 1 em texto'
        ]
    ],
    3 => [
        'pt-BR' => [
            'pergunta3' => 'pergunta 3 em texto',
            'resposta3' => 'resposta 3 em texto'
        ]
    ]
];

krsort($vetor);// ordena de forma decrescente
$vetor = array_values($vetor);// extrai os valores do array e cria novas chaves para ele
var_dump($vetor);

$vetor = json_encode($vetor);// json na ordem desejada
var_dump($vetor);

The result of the first var_dump in this case will be:

array(2) {
  [0]=>
  array(1) {
    ["pt-BR"]=>
    array(2) {
      ["pergunta3"]=>
      string(19) "pergunta 3 em texto"
      ["resposta3"]=>
      string(19) "resposta 3 em texto"
    }
  }
  [1]=>
  array(1) {
    ["pt-BR"]=>
    array(2) {
      ["pergunta1"]=>
      string(19) "pergunta 1 em texto"
      ["resposta1"]=>
      string(19) "resposta 1 em texto"
    }
  }
}

And the second var_dump after json_encode will return:

string(161) "[{"pt-BR":{"pergunta3":"pergunta 3 em texto","resposta3":"resposta 3 em texto"}},{"pt-BR":{"pergunta1":"pergunta 1 em texto","resposta1":"resposta 1 em texto"}}]"
    
06.07.2017 / 20:28