Php array sort in functie de valoare

Salut, am create un array care arata cam asa:

$top  = array();
foreach($photos as $photo)
{
  $top[$photo[$id]] = $photo['views'];
}

Acum as dori sa fac un loop la array-ul top si sa-mi sorteze in functie de value, adica $photo[‘views’].
In momentul de fata primesc asa:

Array ( [1647504485525346] => 52 [1645586539050474] => 160 [1480642642211532] => 36 [1480640565545073] => 39 [1480638365545293] => 9);

Cum as putea face asta?

http://php.net/manual/ro/array.sorting.php

Ms,dar imi sorteaza KEY, nu value.

Daca citeai documentatia vedeai ca ai optiunea de a sorta si dupa value. Arunca o privire in tabelul din pagina respectiva.

2 Likes

arsort($topP);

Multumesc !

Revin tot aici, n-are rost sa deschid alt topic. Am array-ul populat cu

$prieten[] = array($like['id'],"name"=>$like['name']);

Aici exista posibilitatea ca prietenul sa apara de mai multe ori, in functie de LIKE-urile date pozelor, ideea de baza e sa scot acel prieten si sa-i maresc scorul intr-un array in functie de numarul aparitiilor lui in array.
Deci daca am gasit profilul X in array de 3ori, sa pot sa am profil[‘x’][‘count’] = 3, dupa care sa-i sortez in aceasta ordine.

Am incercat cu array_sort ,dar nu se poate deoarece eu am mai multe valori (id,name,avatar eventual)

Maybe

uasort($prieteni, 'mySort');

function mySort($a, $b) {
    return ($a['x']['count'] < $b['x']['count']) ? -1 : 1;
}

Ar fi ok ca idee, insa nu stiu cum sa stochez rezultatul , adica “count” si cum sa-mi pastrez valorile anterioare (“name,avatar”)

ceva de gen am facut eu demult, iti dau link sa citesti toata discutia, abordarea de acolo o poti folosi si la array-ul tau - http://www.tutorialeonline.net/ro/forum/topic/337

Multumesc, cred ca functioneaza. Insa in timp ce adaptam, m-am lovit de valoarea ‘total’ care eu inca nu o am stocata, va trebui sa o scot si sa recreez un array,iar total va fi numarul de key duplicat.Nu stiu cum as putea face asta.

Ceva ge genul am incercat eu

  foreach($postari['data'] as $post)
{
    foreach($post['likes']['data'] as $like)
    {
        $prieten[] = array('id'=>$like['id'],"name"=>$like['name']);
    }
}
$i = 0;
foreach($prieten as $key=>$value)
{
    if(in_array($value,$prieten))
    {
        $i++;
        echo 'Este in array';
    }
    else
    {
        echo 'Nu este in array !';
    }
    echo ' '.$i.'<br /><br />';
}

Si sa refac un array, cu acel i++ sa-l stochez ca valoare “count” ori “total”, nu conteaza.

Dac-am înțeles bine, structura ta de date arată cam așa:

Array
(
    [data] => Array
        (
            [0] => Array
                (
                    [likes] => Array
                        (
                            [data] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 1337
                                            [name] => 'Foo Bar'
                                        )
                                    // ... alte like-uri
                                )
                        )
                )
            // ... alte postări
        )
)

…caz în care, soluția ar fi:
(În cazul în care unii prieteni au același număr de like-uri, aceștia sunt sortați și după nume.)


PHP 5.3.5 -> 5.6


$prieteni = array();

foreach ($postari['data'] as $post) {
    foreach ($post['likes']['data'] as $like) {
        if (!isset($prieteni[$like['id']])) {
            $prieteni[$like['id']] = array(
                'name'  => $like['name'],
                'likes' => 0
            );
        }

        $prieteni[$like['id']]['likes']++;
    }
}

$compare = function($key, $prev, $next) {
    if ($prev[$key] === $next[$key]) {
        return 0;
    }

    return $prev[$key] < $next[$key] ? -1 : 1;
};

uasort($prieteni, function($prev, $next) use ($compare) {
    return $compare('likes', $prev, $next) ?: $compare('name', $prev, $next);
});

PHP 7.0+


$prieteni = [];

foreach ($postari['data'] as $post) {
    foreach ($post['likes']['data'] as $like) {
        $prieteni[$like['id']] = $prieteni[$like['id']] ?? [
            'name'  => $like['name'],
            'likes' => 0
        ];

        $prieteni[$like['id']]['likes']++;
    }
}

uasort($prieteni, function($prev, $next) {
    return ($prev['likes'] <=> $next['likes']) ?: ($prev['name'] <=> $next['name']);
});


… unde array-ul $prieteni va avea structura:


Array
(
    // cheia reprezintă id-ul prietenului
    [1337] => Array
        (
            [name] => 'Foo Bar'
            [likes] => 2
        )
    [808] => Array
        (
            [name] => 'Bot Bob'
            [likes] => 3
        )
    [807] => Array
        (
            [name] => 'Bot Jim'
            [likes] => 3
        )


    // ...alți prieteni
)

@bystefu Ar fi foarte util daca ne-ai da un exemplu de structura. Spre exemplu, sa zicem ca tu ai array-ul $example. Ruleaza, te rog, codul de mai jos si ofera-ne rezultatul.

echo "<pre>"; 
var_export($example);
echo "</pre>";