To work with this type of functionality, a recursive function is the easiest way to do it, for example:
JSON file:
{
"users": {
"mariana": "offline",
"joao": "online"
}
}
PHP function
function JSONDB($path, $method, $data, &$value = NULL){
// Separa todas as chaves
$path = explode('/', $path);
// Salva a primeira na variável $key e remove-a da variável $path
$key = array_shift($path);
// Junta todas as chaves em um novo path
$npath = implode('/', $path);
// Verifica se é GET e está na última chave
if ($method == 'GET' && count($path) === 0)
// Adiciona o valor na variável assinada $value
$value = $data[$key];
// Verifica se é SET e está na última chave
else if ($method == 'SET' && count($path) === 0)
// Seta o valor na chave atual
$data[$key] = $value;
// Verifica se a chave atual não está vazia e é um array
else if (!empty($data[$key]) && is_array($data[$key]))
// Desce um nivel no array passando $data[$key] e atualiza o retorno na chave
$data[$key] = JSONDB($npath, $method, $data[$key], $value);
// Nenhuma condição satisfeita, erro (provavelmente caminho errado)
// Ou dados incorretos
else
// Nada a fazer por aqui
$value = FALSE;
// Retorna os dados para serem salvos
return $data;
}
Use
// Arquivo com os dados JSON
$file = 'ususarios.json';
// Define método [GET ou SET]
$method = 'SET';
// Caminho para a propriedade
// IMPORTANTE> JSON é Case Sensitive ou seja, diferencia maiúscula de minúscula
// o caminho deve ser escrito da mesma forma como está no arquivo separados por /
$path = 'users/mariana';
// Valor a ser alterado caso o método seja GET
// Caso o método seja GET o retorno será colocado nessa variável,
// então basta definir a variável e passa-la no quarto parâmetro
$val = 'online';
// Pega os dados do json
$data = file_get_contents($file);
// Transforma do JSON em array
$json = json_decode( $data, true );
// Executa a função recursiva, todos os dados serão retornado
// caso o método seja GET o valor será colocado na variável do quarto parâmetro
$dados = JSONDB($path, $method, $json, $val);
// Salva caso seja SET
if ($method == 'SET')
$salva = file_put_contents("cofing.txt", json_encode($dados));
// Imprimindo os dados
echo '<style>pre{display:block; width:80%; margin: 20px auto;padding:10px;background-color:rgba(0,0,0,0.06);border-radius:5px;box-shadow:inset 2px 2px 5px rgba(0,0,0,0.2);}</style>';
echo '<pre>';
if ( $method == 'SET' ) {
echo $salvo ? 'Arquivo salvo...' : 'Erro ao salvar...';
} else {
// Somente exibir o valor da propriedade
// Obs, a variável $val é o quarto parâmetro passado na função
// que quando o método for GET, será onde o retorno do GET será armazenado
var_dump( $val );
}
echo '</pre>';
// Todos os dados
echo '<pre>';
var_dump($dados);
echo '</pre>';
Upshot
Remarks:
This way of working with data is very primitive, that is, I’m only taking the initial step so that from here you can build your class with methods of data input and output validation, file writing validation and etc.
This type of functionality is very useful for storing settings such as connection to the database and etc. (But of course the file must be protected against external access.
You’re navigating to the wrong element... You’re only taking the first level of the indices, you need a recursive function to go down one level each time... I’m running out of time to do it now, maybe tomorrow...
– KaduAmaral
Aaa truth, I hadn’t realized =Thank you
– Iago Bruno
Jeez but after you run the loop, it will no longer save at the end when put in the file
– Iago Bruno
Just one question: vc does this pq does not know the existence of sqlite or pq the context you find only allows you to do in/json file?
– user6406
I don’t like the table format of these databases and I think if it was in Json tree format it would be better =)
– Iago Bruno
@Iagobruno added the answer.
– KaduAmaral
There are also better alternatives to do this than a .txt. This approach still has simultaneous access problems if several requests run at the same time. Alternatively you can store with Redis, mencached which use a set of key -> value or Mongodb.
– gmsantos
In addition to the possibility of using Nosql, you can still use the Postgresql JSON type.
– Tobias Mesquita