Obter coluna de um array multidimensional que tenha o valor mais alto

  • Autor Autor adruiz
  • Data de início Data de início
Tradução em andamento: em alguns minutos este tópico estará em português. Por enquanto, o conteúdo está no original em espanhol. Ver original
adruiz

adruiz

Gamma
Verificación en dos pasos activada
A ver si alguien puede echarme un clave con esto.

Tengo un objeto json que convierto en un array mediante json_decode, dicho array contiene múltiples arrays con dos valores cada uno, precios y fechas. Lo que me interesa es obtener el array que contiene el precio más alto, esto lo estaba haciendo con un simple max($arr) que parecía funcionar bien, hasta que me he encontrado casos que en realidad no me devuelve el precio más alto.

He probado también con max(array_column($arr, 'price')) y ocurre lo mismo, pero de todos modos esta solución no me interesa porque lo que busco no es obtener el valor más alto, sino el array que lo contiene.

Dejo por aquí un código de ejemplo:
PHP:
$arr = '[{"price": "70 €","date": "2020-12-05 06:45:21"},{"price": "102,2 €","date": "2021-12-05 16:45:21"}]';
$arr = json_decode($arr);

var_dump(max($arr));
var_dump(max(array_column($arr, 'price')));

Ambos var_dump devuelven el array de 70 € (o 70 € en el caso del segundo), lo podéis comprobar directamente aquí.

He trasteado con el date y no parece afectar de ningún modo al max(), también probando los números en limpio (sin el €) y el resultado es el mismo, si fuera el caso de que tuviera que sanitizarlos al hacer la comparación ahora mismo no caigo en cómo podría hacerlo, pero ya adelanto que no se pueden modificar en el json original, porque son datos extraídos de una base de datos.

¿Alguna sugerencia? Os voy leyendo.

Gracias de antemano 👍
 
Solução
J0ss
Otra opción usando expresiones regulares.

PHP:
<?php
$arr = '[{"price": "70 €","date": "2020-12-05 06:45:21"},{"price": "102,2 €","date": "2021-12-05 16:45:21"}]';

$newarr = preg_replace('/"(([0-9]{1,9}),([0-9]{1,9}).?€)"/', '$2.$3', $arr);
$newarr = preg_replace('/"([0-9]{1,9}).?€"/', '$1', $newarr);

$arr = json_decode($newarr);
  

var_dump(max($arr));


php.JPG
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao terminar
Hola, tu problema es que estas comparando texto y no números decimales

PHP:
<?php
$arr = '[{"price": "70 €","date": "2020-12-05 06:45:21"},{"price": "102,2 €","date": "2021-12-05 16:45:21"}]';
    $arr = json_decode($arr);

$arr2= array_column($arr, 'price');

$arr2=str_replace(array("€", " ","."), '', $arr2); //borra el espacio, el simbolo de euro y el separador de miles
$arr2 = str_replace(",", ".", $arr2);  // cambia la coma por el punto decimal

$arr2=array_map('floatval', $arr2); // convierte el arreglo en decimal tipo float

var_dump(max($arr2)); //maximo del arreglo

1641583666755.png
 
Otra opción usando expresiones regulares.

PHP:
<?php
$arr = '[{"price": "70 €","date": "2020-12-05 06:45:21"},{"price": "102,2 €","date": "2021-12-05 16:45:21"}]';

$newarr = preg_replace('/"(([0-9]{1,9}),([0-9]{1,9}).?€)"/', '$2.$3', $arr);
$newarr = preg_replace('/"([0-9]{1,9}).?€"/', '$1', $newarr);

$arr = json_decode($newarr);
  

var_dump(max($arr));


php.JPG
 
Última edição:
Solução
Voltar
Topo