-
Total de itens
767 -
Registro em
-
Última visita
Tudo que kania postou
-
Função genérica para atualizar chave em JSON duplicada usando o PHP
kania postou um tópico no fórum PHP
Tenho a seguinte situação. Recebo vários JSONs podendo ou não ser multidimensional, preciso atualizar uma determinada chave deste JSON, o problema é que algumas chaves podem ser duplicadas, bem como seus respectivos valores. Como estou tentando criar uma função genérica para navegar em qualquer JSON e modificar a chave em si, com estas duplicidades de chaves, estou tendo dificuldades em dizer ao código qual é chave que devo alterar. Arquivo JSON Exemplo { "CREDITOR": { "TAX": { "TAC": 0.7 }, "ENABLE": "true", "PRODUCTION": { "email": "email@dominio.com", "senha": "12457895", "BASE_URL": "https://domino.com" }, "HOMOLOGATION": { "email": "email@dominio.com", "senha": "12457895", "BASE_URL": "https://domino.com" }, "TARGET_VALUES": 5000000 } } Converto o JSON para array $json = json_decode($json_string, true); Função que criei até aqui /** * Encontra a chave correspondente dentro do JSON * * @param array $jsonArray - JSON a ser verificado * @param string $keyFather - chave de entrada * @param string $keyUpdate - chave que modificar * @param string $valueUpdate - novo valor da chave * @return string * */ public static function searchKeyJson(array $jsonArray, string $keyFather, string $keyUpdate = null, $valueUpdate = null) { foreach ($jsonArray as $key => $value) { if ($key == $keyFather && $keyUpdate == null) { $jsonArray[$key] = $valueUpdate; return $jsonArray; } if ($key == $keyFather && $keyUpdate != null) { $jsonArray[$keyFather][$keyUpdate] = $valueUpdate; return $jsonArray; } if (is_array($value)) { if (($result = self::searchKeyJson($value, $keyFather, $keyUpdate, $valueUpdate)) !== false) { if ($keyUpdate == null) { return $result; } else { return $result; } } } } return false; } Até modifico o valor, mais no final para salvar, ele não monta o JSON como original, ele caba ignorando a chave inicial no JSON de exmeplo "CREDITOR": {} Retorno da função (notem que esta forma do padrão da original) => [ "TAX" => [ "TAC" => 0.7, ], "ENABLE" => "true", "PRODUCTION" => [ "email" => "teste", "senha" => "12457895", "BASE_URL" => "https://domino.com", ], "HOMOLOGATION" => [ "email" => "email@dominio.com", "senha" => "12457895", "BASE_URL" => "https://domino.com", ], "TARGET_VALUES" => 5000000, ] Se eu percorrer o array e tentar modificar a chave em questão, ele muda todas as as chaves que tiverem no JSON porque tem duplicidade. Como posso resolver isto com uma função global que sirva para qualquer padrão de JSON que eu tiver? -
Função genérica para atualizar chave em JSON duplicada usando o PHP
kania respondeu ao tópico de kania em PHP
Olá Matheus, tudo bom? Bacana sua ideia, funciona bem quando passamos bem definida as referencias, mais acaba no mesmo problema que eu ainda não consegui resolver, a função não fica genérica para tratar qualquer json passando um parent como referencia para alterar um children. Por exemplo, vamos dizer que o mesmo json foi modificado em algum momento e agora preciso modificar a chave TAC, eu precisaria passar como paramento principal a chave TESTE ou CREDITOR, e nas referencias todas as chaves em cadeia para modificar o item correto, isto? Estou tentando facilitar a vida do Front em não ter que passar todas estas referencias para a API, mais não sei se tem como. $ref = &getSubArrayRef( $data, 'TESTE' ); $ref[ 'TAX' ]['TAC'] = 'nova tac'; JSON MODIFICADO COM A CHAVE [TESTE] { "TESTE": { "TAX": { "TAC": 0.7 } }, "CREDITOR": { "TAX": { "TAC": 0.7 }, "ENABLE": "true", "PRODUCTION": { "email": "TESTE 5 tregbg", "senha": "aL1VM8Z6qYsc", "BASE_URL": "https://api.bancarizaao.fiduciascm.digital/" }, "HOMOLOGATION": { "email": "integracao@selectinvestimentos.com", "senha": "1234", "BASE_URL": "https://api.americanohoml.fiduciascm.digital/" }, "TARGET_VALUES": 5000000 } } Outra opção que estou vendo se seria viável é usar spred operator, ai o front continuaria tendo que passar as referencia de toda a arvore que vai ter que ser modificada, contudo só passaria um lista de string, mais ainda não testei para ver se ficaria viável. function teste(...$param){ foreach($param as $key => $val){ echo '["'.$val.'"]'; } } return teste("CREDITOR", "PRODUCTION", "email"); -
Função genérica para atualizar chave em JSON duplicada usando o PHP
kania respondeu ao tópico de kania em PHP
Olá noite Mateus, obrigado por responder. A citação do erro estava correta, dupliquei o retorno do return $result (hehehe) Vamos lá, vou detalhar melhor o que estou tentando fazer. A aplicação Backend esta em uma API em Laravel 9, com banco de dados Mysql e o Front em Vue.js 3. No banco de dados, existem várias tabelas com colunas do tipo jsonb. O que preciso fazer é manipular este campo jsonb no PHP, para isto pensei no seguinte. - Ter uma função genérica já que estes campos jsonb não tem um json igual em cada; - A função precisa poder percorrer o json (já convertido em array para trabalhar no php) e encontrara chave especifica para poder modifica-la No exemplo acima, eu cheguei a conseguir modificar a chave email da chave pai PRODUCTION efetuando chamada searchKeyJson($jsonArray, , , "VALOR MODIFICADO") Sendo que o parâmetro $keyUpdate é facultativo, já que posso precisar alterar um chave que esta em primeiro nível no json. Funcionou a modificação para este exemplo de json/array, mais não funciona em todos os casos, pois como monto as chaves na $jsonArray[$keyFather][$keyUpdate] = $valueUpdate; ele se perde quando não encontra as referencias conforme a profundidade do array. A ideia inicial era que eu pudesse passar apenas a chave em si que quero manipular (exemplo: email), mais não funcionaria porque como no json do exemplo, eu tenho duas chaves e-mail, uma no PRODUCTION e outra no HOMOLOGATION, logo ou vai modificar todas as chaves, ou vai modificar apenas a primeira que encontrar. Ai estou pesquisando para ver como posso resolver este pepinão (hehehe), tendo em vista que estes campos jsonb do banco tem configuração do sistema importantes que precisam ser manipulados em um front, não da para ficar ajustando eles não mão sempre que precisar. Exemplo da Função completa ate o momento, com 2 json e duas chamadas para testar, ambas funcionam, porem como mencionei, dependendo da profundidade da chave não consegue fazer a atualização. <?php // $json_string = '{"COMISSAO":{"EXTRA":0.5,"AGENTE":0.5,"ESCRITORIO":1},"PROPOSTA":{"API":[4,5,6,7,8,9,10,11],"JUROS":[1,2],"PRAZO":[1,2,3,4],"MAX_JUROS":2}}'; $json_string = '{"CREDITOR":{"TAX":{"TAC":0.7},"ENABLE":"true","PRODUCTION":{"email":"email@dominio.com","senha":"12457895","BASE_URL":"https://domino.com"},"HOMOLOGATION":{"email":"email@dominio.com","senha":"12457895","BASE_URL":"https://domino.com"},"TARGET_VALUES":5000000}}'; $json = json_decode($json_string, true); function searchKeyJson(array &$jsonArray, string $keyFather, string $keyUpdate = null, $valueUpdate = null) { foreach ($jsonArray as $key => $value) { if ($key == $keyFather && $keyUpdate == null) { $jsonArray[$key] = $valueUpdate; return $jsonArray; } if ($key == $keyFather && $keyUpdate != null) { $jsonArray[$keyFather][$keyUpdate] = $valueUpdate; return $jsonArray; } if (is_array($value)) { if (($result = searchKeyJson($jsonArray[$key], $keyFather, $keyUpdate, $valueUpdate)) !== false) { return $jsonArray; } } } return false; } // Chamada da função sem passar a chave de resultado $returnWithoutKey = searchKeyJson($json, "PRODUCTION", "email", "TESTE UPDATE"); // $returnWithoutKey = searchKeyJson($json, "PROPOSTA", "API", [1,2,5,8]); // Exemplo de valor a ser modificado dentro do JSON echo "RETORNO".PHP_EOL; echo "========================".PHP_EOL; print_r($returnWithoutKey); ?> -
Procedure e Trigger no MySQL para atualizar a mesma tabela que o registro for inserido
kania postou um tópico no fórum MySQL
Olá pessoal, Estou tentando criar uma procedure no MySql para seja disparada sempre que um novo registro for cadastrado na tabela. Ela precisa atualizar um campo específico concatenando dois outros campos de outra tabela. Isto é possível? Preciso concatenar a coluna ID e ID_BANCO, da tabela empresa e atualizar a coluna CODIGO_OPERACAO da tabela proposta. Executando o que eu fiz funciona certinho, mais o que eu quero é que ela rode sozinha atualizando o campo CodigoOperacao do registro novo logo após este registro ser criado, isto porque preciso do novo ID criado, do Documento cadastrado e do Id_banco cadastrado para poder atualizar o mesmo registro. DELIMITER $$ CREATE PROCEDURE pr_codigo_operacao(IN _Id INT, IN _Documento VARCHAR(50), IN _IdBanco VARCHAR(50)) BEGIN UPDATE propostas SET CodigoOperacao = CONCAT(_Documento, "-", _IdBanco) WHERE Id = _Id; END $$ Criei um trigger para chamar a procedure, porém a mesma esta dando erro quando tento fazer um INSERT, ERRO #1442 - Can't update table 'propostas' in stored function/trigger because it is already used by statement which invoked this stored function/trigger DELIMITER $$ CREATE TRIGGER tgr_atualiza_codigo_operacao AFTER INSERT ON propostas FOR EACH ROW BEGIN CALL pr_codigo_operacao (new.Id, new.DocumentoCliente, new.Id_banco); END $$