bystefu
(Stefu Catalin)
mai 25, 2016, 10:03am
1
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?
noah
(noah)
mai 25, 2016, 10:15am
2
bystefu
(Stefu Catalin)
mai 25, 2016, 10:16am
3
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
bystefu
(Stefu Catalin)
mai 25, 2016, 12:16pm
6
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)
GarryOne
(Igor Mardari)
mai 25, 2016, 12:30pm
7
Maybe
uasort($prieteni, 'mySort');
function mySort($a, $b) {
return ($a['x']['count'] < $b['x']['count']) ? -1 : 1;
}
bystefu
(Stefu Catalin)
mai 25, 2016, 1:12pm
8
Ar fi ok ca idee, insa nu stiu cum sa stochez rezultatul , adica “count” si cum sa-mi pastrez valorile anterioare (“name,avatar”)
Birkoff
(Birkoff)
mai 25, 2016, 4:23pm
9
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
bystefu
(Stefu Catalin)
mai 26, 2016, 9:03am
10
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.
bystefu
(Stefu Catalin)
mai 26, 2016, 9:15am
11
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
)
Sapioit
(Sapioit)
mai 30, 2016, 12:40pm
14
@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>";