Uma dica é colocar o texto em javascript entre ' '. no meu caso o comando json_decode só funcionou com o texto assim. Segue abaixo:
<?php
/*Tarefas*/
/*Listar o número de países participantes;
Fazer com que seus nomes fiquem em letras maiúsculas;
Ordenar:
Pelo país que tiver mais medalhas de ouro
Em caso de empate, pelo país que tiver mais medalhas de prata
Em caso de empate, pelo país que tiver mais medalhas de bronze
Listar o número de medalhas distribuídas na competição*/
/*Primeira coisa a fazermos é ler esse arquivo em JSON e transformá-lo em algum dado que a gente possa maniuplar em PHP.*/
$dadosEmString = '[
{
"pais": "Brasil",
"medalhas": {
"ouro": 3,
"prata": 5,
"bronze": 3
}
},
{
"pais": "Costa rica",
"medalhas": {
"ouro": 5,
"prata": 4,
"bronze": 4
}
},
{
"pais": "Estados unidos",
"medalhas": {
"ouro": 4,
"prata": 3,
"bronze": 5
}
},
{
"pais": "Trindade e tobago",
"medalhas": {
"ouro": 4,
"prata": 3,
"bronze": 4
}
}
]';
/*Podemos notar que recebemos como retorno um array de objetos do tipo stdClass.*/
$dadosEmJson = json_decode($dadosEmString);
//var_dump($dadosEmJson);
/*Se nós adicionássemos um segundo atributo à função json_decode, poderíamos informar que ao invés de objetos do tipo
stdClass nós gostaríamos de receber arrays associativos. Transformando em Array Associativo*/
$dadosEmJson = json_decode($dadosEmString,true);
//var_dump($dadosEmJson);
/*Numero de itens no array*/
$numeroDePaises = count($dadosEmJson);
echo 'O numero de paises na competição é: ',$numeroDePaises.PHP_EOL;
//Mapear o nosso array para um novo com os valores modificados para letras maiusculas
$dadosEmJson = array_map(function ($item){
$item['pais']=mb_convert_case($item['pais'],MB_CASE_UPPER);
return $item;
},$dadosEmJson);
//var_dump($dadosEmJson);
//Ordenar o quadro de medalhas
usort($dadosEmJson,function ($item1,$item2){
if ($item1['medalhas']['ouro'] > $item2['medalhas']['ouro']) {
return -1;
}
if ($item1['medalhas']['ouro'] < $item2['medalhas']['ouro']) {
return 1;
}
return 0;
});
/*Agora nós chegamos na última tarefa. Precisamos pegar todo esse array
realizar os cálculos e retornar o número de medalhas distribuídos nessa competição.
usaremos o array_reduce */
$numeroDeMedalhas = array_reduce($dadosEmJson,function ($medalhasAcumuladas,$itemAtual){
$medalhasDoPais = array_reduce($itemAtual['medalhas'], function ($medalhasAcumuladasDoPaisAtual,$medalhasDoPaisAtual){
return $medalhasAcumuladasDoPaisAtual + $medalhasDoPaisAtual;
},0);
return $medalhasAcumuladas + $medalhasDoPais;
},0);
echo "Total de medalhas entregues: $numeroDeMedalhas".PHP_EOL;
// Paises que não tem espaço entre os nomes
$paisesComNomeSemEspaco = array_filter($dadosEmJson, function ($item) {
return strpos($item['pais'], ' ') === false;
});
var_dump($paisesComNomeSemEspaco);
/*Recapitulando estes foram os passos que conseguimos no exercicio:*/
/*
Ler uma string em json para um formato conhecido pelo PHP;
Contar os itens de um array;
Mapear um array para outro com alterações;
Ordenar um array com regras complexas;
Reduzir um array a um único valor (a soma, por exemplo);
Filtrar um array baseado em algum critério que definirmos;
Como colocar uma string em letras maiúsuclas com mb_convert_case;
Procurar uma string dentro de outra com strpos.
*/