Effectiviteit van dit stukje code (foreach met break)
Mijn eerste post hier kom ik meteen binnengewalst met een vraag. Niet zo zeer hoe iets moet maar ben benieuwd naar meningen over hoe efficient deze code is.
foreach ($users as $user) {
$post_count = get_usernumposts($bloguser->user_id);
$user_list[$bloguser->user_id]=$post_count;
}
foreach ($user_list as $key => $value) {
$count++;
// doe code
if($count<=5){
// doe code
}
else
{
break;
}
}
Het ding is ik weet niet hoeveel users ik in de userlist krijg, maar ik weet wel na hoeveel users ik de lijst wil afbreken. In dit voorbeeld dus 5. Is deze break om de foreach loop op dit moment af te breken efficient? of kan ik beter iets anders gebruiken hiervoor?
Alvast bedankt, hoop dat de code duidelijk is heb het natuurlijk een beetje ingekort :).
Gewijzigd op 07/11/2010 11:40:22 door Seb D
Punt is dat de code een lijst met gebruikers binnenhaalt en hoeveel post deze hebben gedaan dus
[0][naam] => "pietje"
[0][posts] => 55
en dat van alle users, dus van te voren weet je niet wie het meeste posts heeft. vervolgens sorteer ik de array met data zodat ik een top van posts kan maken (dus de 5 mensen met de meeste posts).
Normaal gesproken zou je dat prima kunnen afvangen in sql met een join & limit o.i.d. maar dit gaat om een wordpress installatie waarbij je voor het nette de wp hooks moet gebruiken.
thanx voor je reactie en meedenken!
count_many_users_posts wat maar één query voor alle users hoeft uit te voeren. Dat lost je eerste foreach-lus al op.
Nadat je hem gesorteerd hebt kan je zo'n foreach lus doen zoals jij hem gebruikt, je kan ook iets met een for-lus doen, het is maar wat je zelf leuk vindt, het is allemaal bij benadering even efficiënt. Een foreach-lus is denk ik wel beter leesbaar dan dit
Versie 3 en hoger van WP hebben Nadat je hem gesorteerd hebt kan je zo'n foreach lus doen zoals jij hem gebruikt, je kan ook iets met een for-lus doen, het is maar wat je zelf leuk vindt, het is allemaal bij benadering even efficiënt. Een foreach-lus is denk ik wel beter leesbaar dan dit
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$users = array(
4 => 'Jelmer',
12 => 'Bas',
27 => 'Jan',
18 => 'Klaas');
// $post_counts = count_many_users_posts(array_keys($users));
$post_counts = array(
4 => 12,
12 => 127,
27 => 18,
18 => 2);
arsort($post_counts);
for ($count = 0;
$count < 5 && (list($user_id, $post_count) = each($post_counts));
++$count)
{
printf("Gebruiker %s heeft %d posts\n",
$users[$user_id], $post_count);
}
?>
$users = array(
4 => 'Jelmer',
12 => 'Bas',
27 => 'Jan',
18 => 'Klaas');
// $post_counts = count_many_users_posts(array_keys($users));
$post_counts = array(
4 => 12,
12 => 127,
27 => 18,
18 => 2);
arsort($post_counts);
for ($count = 0;
$count < 5 && (list($user_id, $post_count) = each($post_counts));
++$count)
{
printf("Gebruiker %s heeft %d posts\n",
$users[$user_id], $post_count);
}
?>
lost nog steeds het probleem niet op dat ik altijd alle users uit de database moet trekken. Maar die for loop vind ik wel mooier dan mijn foreach. Tevens ben ik er door jou post achtergekomen dat ik een wp-functie gebruik die niet meer gesupport wordt en misschien in volgende versies verwijderd wordt, dus kan ik beter de count_many_users_post gebruiken :)