fantasma Posted May 28, 2012 at 01:52 PM Report #458515 Posted May 28, 2012 at 01:52 PM (edited) Boas malta Tenho aqui uma dor de cabeça com um código que estou a fazer para transformar o caminho das imagens que estão num ficheiro .json para outro definido. Até aqui tudo bem... O problema é que, depois de fazer a manipulação disto, e obter os resultados esperados, ao codificar novamente o array para .json o ficheiro é reescrito com absolutamente nada lá dentro. Penso que seja um problema no meu código, mas ainda não consegui dar com o gato. Alguém me consegue ajudar?? function prepareImages($file,$url,$article) { $string = file_get_contents($file); $json = json_decode($string,true); foreach($json['elements'] as $value) { if($value['type'] == "image") { $arr = explode('\\', $value['src']); $count = count($arr); $img = $arr[$count-1]; $src = $url.'res/'.$article.'/'.$img; $value['src'] = $src; //print_r($json); } //This prints all the values correctly print_r($value); } // global $value; $json = $value; $string = json_encode($json); file_put_contents($file,$string); } Ficheiro .JSON O ficheiro em si é demasiado extenso, por isso vou apenas postar um "sample" para terem uma ideia. { "id": "publication:0", "settings": { "background": "#ffffff", "url": "C:/xampp/htdocs/publisher/publication/", "title": "publication" }, "elements": [ { "type": "square", "attr": { "size": [ 708, 36 ], "background": "e5f5fe" } }, { "type": "text", "content": "Tori Tori Restaurant \nRojkind Arquitectos + ESRAWE Studio\n", "attr": { "textAlign": "left", "fontFamily": "Whitney Semibold", "fontSize": 32, "lineHeight": 50, "color": "333333" } }, { "type": "image", "src": "\\Volumes\\Work\\InProgress\\ArchDaily\\BOTYApp\\_ClientMaterial\\BOTY2011\\ Winners\\Hotels & Restaurants Winner\\Office profile and questionaire\\Hector Esrawe.jpg", "caption": "", "attr": { "selectable": 0 } }, Edited May 28, 2012 at 02:21 PM by brunoais geshi! Mm q seja JSON, o parser do geshi para js serve bem.
HappyHippyHippo Posted May 28, 2012 at 01:58 PM Report #458520 Posted May 28, 2012 at 01:58 PM 1º - usa o tag code=php no teu post para se poder ler 2º - se tens código comentado que não faz nada, mais vale fazer desaparecer 3º - não forneces o conteúdo do ficheiro (o erro deve estar no parsing $json['elements']) 4º - tenta apresentar o teu código bem indentado 5º - estás a re-declarar a variável $json com o valor da última iteração do ciclo foreach IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
fantasma Posted May 28, 2012 at 02:07 PM Author Report #458523 Posted May 28, 2012 at 02:07 PM (edited) Corrigido... ainda me estou a habituar a este "novo" forum. Quanto à identação, foi o próprio forum que a fez... Pois, a variável $json está a ir buscar a ultima iteração... este foi o ultimo teste que fiz Mas como é que eu consigo fazer isto sem alterar a estrutura do json? Com isto quero dizer, podia meter tudo dentro de um array a cada iteração que saía direito, mas a estrutura do json ia levar com mais um [] no inicio, o que não pode ser feito... Agradeço toda a ajuda Edited May 28, 2012 at 02:08 PM by fantasma
Solution HappyHippyHippo Posted May 28, 2012 at 02:25 PM Solution Report #458532 Posted May 28, 2012 at 02:25 PM (edited) pelo que percebi no teu código o que pretende é somente alterar um parâmetro, para isso é necessário percorrer correctamente os elementos nota : verifiquei que o json_decode não gosta da sequência de caracteres '\\' function prepareImages($file,$url,$article) { $string = str_replace("\\", "/", file_get_contents($file)); // <-- remove os '\\' alterando por '/' $json = json_decode($string,true); foreach($json['elements'] as $index => $value) { if($value['type'] == "image") { // para alterar o valor em $jsom é necessário ir directamente ao array // a variável $value é uma cópia dos dados // tens também a maneira mais directa de ir ler o ultimo elemento do url $json['elements'][$index]['src'] = $url.'res/'.$article.'/'.end(explode("/", $value['src'])); } } file_put_contents($file,json_encode($json));; } Edited May 28, 2012 at 02:26 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
fantasma Posted May 28, 2012 at 02:36 PM Author Report #458538 Posted May 28, 2012 at 02:36 PM (edited) Dá-me este erro Warning: Invalid argument supplied for foreach() in .... Estranho porque o loop parece-me correcto 😕 EDIT: Já percebi o porquê do erro O caminho das imagens no .json aparece como \\caminho\\para\\imagem, e o str_replace so estava a substituir \, o que depois no decode, não fazia a variavel assumir-se como array (o que originava o erro). Substitui a linha $string = str_replace("\\", "/", file_get_contents($file)); // <-- remove os '\\' alterando por '/' por $string = str_replace("\\\\", "/", file_get_contents($file)); // <-- remove os '\\' alterando por '/' E já funciona na perfeição. Obrigado HappyHippyHippo Edited May 28, 2012 at 02:54 PM by fantasma
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now