Jak posortować JSON?

0
$apikey = '';
$apisecret = '';
$nonce=time();
$uri='';
$sign=hash_hmac('sha512',$uri,$apisecret);
$ch = curl_init($uri);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('apisign:'.$sign));
$execResult = curl_exec($ch);
$obj = json_decode($execResult);

Otrzymuje:

{"success" : true,"message" : "","result" : [{"Nazwa" : "A","Ile" : "3"}, {"Nazwa" : "B","Ile" : "1"}, {"Nazwa" : "C","Ile" : "2"}]}

Jak wyświetlić posortowane według Ile rosnąco?

0

Użyć głowy, szarych komórek i wpisać w google "json sort by value" dodając nazwę języka programowania. Ot, cała tajemnica...

0

Wrzuć do MongoDB a następnie:

db.myCollection.find({}).sort({"result.ile" : 1})
0

Zależy gdzie to się jeszcze obrabia. Tak sobie trochę poćwiczyłem:

define('SORT_ASCENDING', 1);
define('SORT_DESCENDING', -1);

$json = '{"success" : true,"message" : "","result" : [{"Nazwa" : "A","Ile" : "3"}, {"Nazwa" : "B","Ile" : "1"}, {"Nazwa" : "C","Ile" : "2"}]}';
$array = json_decode($json, true);

function compare($a, $b, $key, $value) 
{
    if ($a == $b)
    {
        return 0;
    }
    
    return $a[$key] > $b[$key] ? $value : -$value;
}

function build_sorter($key, $direction = SORT_ASCENDING) 
{
    return function ($a, $b) use ($key, $direction) 
    {
        return compare($a, $b, $key, $direction);
    };
}

usort($array['result'], build_sorter('Ile', SORT_ASCENDING));
echo json_encode($array);
0
drorat1 napisał(a):

Zależy gdzie to się jeszcze obrabia. Tak sobie trochę poćwiczyłem:

define('SORT_ASCENDING', 1);
define('SORT_DESCENDING', -1);

$json = '{"success" : true,"message" : "","result" : [{"Nazwa" : "A","Ile" : "3"}, {"Nazwa" : "B","Ile" : "1"}, {"Nazwa" : "C","Ile" : "2"}]}';
$array = json_decode($json, true);

function compare($a, $b, $key, $value) 
{
    if ($a == $b)
    {
        return 0;
    }
    
    return $a[$key] > $b[$key] ? $value : -$value;
}

function build_sorter($key, $direction = SORT_ASCENDING) 
{
    return function ($a, $b) use ($key, $direction) 
    {
        return compare($a, $b, $key, $direction);
    };
}

usort($array['result'], build_sorter('Ile', SORT_ASCENDING));
echo json_encode($array);

Jeśli do zmiennej $json przypisze tak jak ty:

$json = '{"success" : true,"message" : "","result" : [{"Nazwa" : "A","Ile" : "3"}, {"Nazwa" : "B","Ile" : "1"}, {"Nazwa" : "C","Ile" : "2"}]}';

to działa sortowanie ale API zwraca za każdym razem inne wartości, wieć trzeba tak zrobić żeby nie przypisywać do zmiennej $json tego co zwróci, próbowałem zrobić tak

<?php
define('SORT_ASCENDING', 1);
define('SORT_DESCENDING', -1);

		$apikey = '';
        $apisecret = '';
$nonce=time();
$uri='';
$sign=hash_hmac('sha512',$uri,$apisecret);
$ch = curl_init($uri);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('apisign:'.$sign));
$execResult = curl_exec($ch);
$obj = json_decode($execResult);


$json = $obj;

$array = json_decode($json, true);
 
function compare($a, $b, $key, $value) 
{
    if ($a == $b)
    {
        return 0;
    }
 
    return $a[$key] > $b[$key] ? $value : -$value;
}
 
function build_sorter($key, $direction = SORT_ASCENDING) 
{
    return function ($a, $b) use ($key, $direction) 
    {
        return compare($a, $b, $key, $direction);
    };
}
 
usort($array['result'], build_sorter('Ile', SORT_ASCENDING));
echo json_encode($array);

?>

ale nie działa

0

No nie. API ma Ci zwrócić JSON, który to niepotrzebnie już raz w tym kodzie zdekodowałeś, w dodatku do Object a tu chodzi o zdekodowanie jako associative array, stąd TRUE w json_decode

<?php
define('SORT_ASCENDING', 1);
define('SORT_DESCENDING', -1);

$apikey = '';
$apisecret = '';
$nonce=time();
$uri='';
$sign=hash_hmac('sha512',$uri,$apisecret);

$handle = curl_init($uri);
curl_setopt($handle, CURLOPT_HTTPHEADER, array('apisign:'.$sign));
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($handle);
curl_close($handle);

$array = json_decode($json, true);

function compare($a, $b, $key, $value)
{
    if ($a == $b)
    {
        return 0;
    }

    return $a[$key] > $b[$key] ? $value : -$value;
}

function build_sorter($key, $direction = SORT_ASCENDING)
{
    return function ($a, $b) use ($key, $direction)
    {
        return compare($a, $b, $key, $direction);
    };
}

usort($array['result'], build_sorter('Ile', SORT_ASCENDING));

header('Content-Type: application/json');
echo json_encode($array);

I zakładam że ten kod ma też wypluć wynikowy JSON ale już z posortowanymi danymi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1