Avatar billede eaglewing Nybegynder
13. maj 2008 - 15:18 Der er 16 kommentarer og
2 løsninger

Sortering af multi assoc array

Har et array, ser sådan her ud:

$events=array
        (
    $dato=substr($template['post_subject'],1,10),
    $link=$template['post_url'],
    $subject=substr($template['post_subject'],12),
    $text=substr($template['post_text'],0,200)            );

Data der bliver assigned kommer fra en DB, og er ingen problemer i den del.

Nå så til 200 points spørgsmålet - jeg skal bruge en lille simpel kode som gør følgende:

1) Sortere array efter $events['dato'].
2) Udskriver hele array.

Kan ikke selv finde hoved og hale i arrays.

(PHP5 er ok)
Avatar billede eaglewing Nybegynder
13. maj 2008 - 15:19 #1
Hov, må hellere tilføje at $events['dato'] er en STRING og indeholder datoen i "dd-mm-yyyy" format.

Er ikke helt sikker på hvordan sortering af det vil virke, måske skal jeg først ha konvertereret den streng til en reel date variable?
Avatar billede jakobdo Ekspert
13. maj 2008 - 15:26 #2
Da jeg synes du er dårlig til at beskrive og give brugbare info, er dette baseret på rene gætterier. :o)

function eventCmp($a, $b)
{
    if ($a['dato'] == $b['dato']) {
        return 0;
    }
    return ($a['dato'] < $b['dato']) ? -1 : 1;
}

$events = array(....);

usort($events, "eventCmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}
Avatar billede eaglewing Nybegynder
13. maj 2008 - 15:48 #3
Ok, smider lige hele koden her så er det måske mere klart:
---------------------------------------------------------------
<?
$db=mysql_connect ("xxxxxx", "xxxxxx", "xxxxxxx") or die ('I cannot connect to the database because: ' . mysql_error());
mysql_select_db ("pryo_phpbbaoc");
$phpbb_prefix="phpbb_";
$news_forum="56";
$forum_location="../phpbb";

$sql_topic = 'SELECT forum_id, topic_id, topic_first_post_id, topic_views, topic_replies, topic_first_poster_name, topic_first_poster_colour FROM `'.$phpbb_prefix.'topics` WHERE forum_id = '.$news_forum.' ORDER BY topic_id ASC';
//echo $sql_topic;
$result_topic = mysql_query($sql_topic) or die('Error: TOPIC SQL');
while ($_topic = mysql_fetch_array($result_topic))
{
    $sql_forum ='SELECT forum_name FROM `'.$phpbb_prefix.'forums` WHERE forum_id = '.$news_forum;
    $result_forum = mysql_query($sql_forum) or die('Error: FORUM SQL');
    while ($_forum = mysql_fetch_array($result_forum))
    {
    $forum_name = $_forum['forum_name'];
    }
    $sql_posts = 'SELECT * FROM `'.$phpbb_prefix.'posts` WHERE post_id = '. $_topic['topic_first_post_id'] .' AND post_approved = 1';
    $result_posts = mysql_query($sql_posts) or die('Error: POSTS SQL');
    while ($_posts = mysql_fetch_array($result_posts))
    {
        $user_id = $_posts['poster_id'];
        $sql_poster = 'SELECT * FROM `'. $phpbb_prefix .'users` WHERE user_id = '.$user_id;
        //echo $sql_poster;
        $result_poster = mysql_query($sql_poster) or die('Error: USERS SQL');
        while ($_poster = mysql_fetch_array($result_poster))
        {
            if($_topic['topic_replies'] == 0)
            {
                $template['comments_amount'] = 'No';
                $template['comments_plural'] = $comments_plural_form;
            }
            elseif($_topic['topic_replies'] == 1)
            {
                $template['comments_amount'] = $_topic['topic_replies'];
                $template['comments_plural'] = '';
            }
            else
            {
                $template['comments_amount'] = $_topic['topic_replies'];
                $template['comments_plural'] = $comments_plural_form;
            }
           
            if($_poster['user_avatar_type'] == 2)
            {
                $template['avatar_url'] = $_poster['user_avatar'];
            }
            elseif($_poster['user_avatar_type'] == 1)
            {
                $template['avatar_url'] = $forum_location.'/'.$avatar_location.'/'.$_poster['user_avatar'];
            }
            else
            {
                $template['avatar_url'] = '';
            }
           
            $template['post_url'] = $forum_location .'/viewtopic.php?f='. $_posts['forum_id'] .'&p='. $_posts['post_id'] .'#p'. $_posts['post_id'];
            $template['post_subject'] = $_posts['post_subject'];
            $template['profile_url'] = $forum_location . '/memberlist.php?mode=viewprofile&u='. $_posts['poster_id'];
            $template['poster'] = $_poster['username'];
            $template['poster_colour'] = $_poster['user_colour'];
            $template['post_date'] = date($date_format, $_posts['post_time']);
            $template['post_text'] = str_ireplace(':'. $_posts['bbcode_uid'], '', $_posts['post_text']);
            $template['comments_url'] = $template['post_url'];
            $template['add_comment_url'] = $forum_location .'/posting.php?mode=reply&amp;f='. $_posts['forum_id'] .'&amp;t='. $_topic['topic_id'];
            $template['pm_post'] = $forum_location .'/forums/ucp.php?i=pm&mode=compose&action=quotepost&p='. $_posts['post_id'];
            $template['pm'] = $forum_location .'/ucp.php?i=pm&mode=compose&u='. $_posts['poster_id'];
            $template['email_by_board'] = $forum_location .'/memberlist.php?mode=email&u='. $_posts['poster_id'];
            $template['email'] = $_posts['user_email'];
            $template['news_forum_url'] = $forum_location .'/viewforum.php?f='. $news_forum;
            $values = array($template['post_url'],    $template['post_subject'],
                $template['profile_url'],    $template['poster'],
                $template['poster_colour'],    $template['avatar_url'],
                $template['post_date'],        $template['post_text'],
                $template['comments_url'],    $template['comments_amount'],
                $template['comments_plural'],    $template['add_comment_url'],
                $template['pm_post'],        $template['pm'],
                $template['email_by_board'],    $template['email'],
                $template['poll_results'],    $template['poll_title'],
                $template['poll_template'],    $template['news_forum_url']);

        $events=array(
                    $dato=substr($template['post_subject'],1,10),
                    $link=$template['post_url'],
                    $subject=substr($template['post_subject'],12),
                    $text=substr($template['post_text'],0,200));
    }
}
}
?>
---------------------------------------------
Det er en "event" side til et phpbb3 board, suger nogle topics fra et bestemt forum - kan se den i effekt her (Upcoming events på www.guild-aoc.com) som du kan se er den ikke sorteret. Der er noget kode jeg har modificeret, så jeg har ikke 100% styr på hvad der sker :P
Avatar billede eaglewing Nybegynder
13. maj 2008 - 15:51 #4
Egentlig extrem dårlig kode da den dør hvis posts ikke er i et bestemt format, men det må jeg leve med, er ikke superkoder :P
Avatar billede jakobdo Ekspert
13. maj 2008 - 15:52 #5
Der sker ikke noget.
Avatar billede eaglewing Nybegynder
13. maj 2008 - 15:56 #6
nej den del er jo det jeg mangler.. i ovenstående kode altså, i den version jeg bruger nu, er der ingen sortering, then skriver bare tingede ud som de bliver hentet fra databasen, dermed er de ikke sorteret da jeg ikke kan sortere på dato i database, da den dato jeg skal bruge er en del at subject på event posten.
Avatar billede eaglewing Nybegynder
13. maj 2008 - 15:56 #7
Er det helt sort snak?
Avatar billede dkfire Nybegynder
13. maj 2008 - 16:13 #8
Måske dit array skulle se sådan ud:

$events[] = array(
                    'dato' => substr($template['post_subject'],1,10),
                    'link' => $template['post_url'],
                    'subject' => substr($template['post_subject'],12),
                    'text' => substr($template['post_text'],0,200));

Men hold da op en rodet kode.
Hvad brguer du $values til ?? Du tildeler den en ny værdi hver gang din inderster while-løkke løber.
Avatar billede eaglewing Nybegynder
13. maj 2008 - 16:19 #9
faktisk ikke noget, har lige indset at den del kunne fjernes, så har gjort det.

Har lige prøvet at tilføjde din kode
-----------------------------------------
$a=usort($events, "eventCmp");

foreach ($events as $key => $value)
{
    echo "$key: $value\n";
}
------------------------------------

Var nødtil at ændre lidt i din foreach og skifte $a ud med $events - nu er output:

Den skriver en post ud, ikke dem alle sammen - hvilket er hvad jeg behøver. og poster lige en pænere kode i et minut.
Avatar billede eaglewing Nybegynder
13. maj 2008 - 16:23 #10
<?
$db=mysql_connect ("xxxxxxxx", "xxxxxxxxx", "xxxxxxxxxxx") or die ('I cannot connect to the database because: ' . mysql_error());
mysql_select_db ("pryo_phpbbaoc");

$phpbb_prefix="phpbb_";
$news_forum="56";
$forum_location="../phpbb";

$sql_topic = 'SELECT forum_id, topic_id, topic_first_post_id FROM `'.$phpbb_prefix.'topics` WHERE forum_id = '.$news_forum.' ORDER BY topic_id ASC';
$result_topic = mysql_query($sql_topic) or die('Error: TOPIC SQL');
while ($_topic = mysql_fetch_array($result_topic))
{
    $sql_posts = 'SELECT * FROM `'.$phpbb_prefix.'posts` WHERE post_id = '. $_topic['topic_first_post_id'] .' AND post_approved = 1';
    $result_posts = mysql_query($sql_posts) or die('Error: POSTS SQL');
    while ($_posts = mysql_fetch_array($result_posts))
    {
        $user_id = $_posts['poster_id'];
        $sql_poster = 'SELECT * FROM `'. $phpbb_prefix .'users` WHERE user_id = '.$user_id;
        $result_poster = mysql_query($sql_poster) or die('Error: USERS SQL');
        while ($_poster = mysql_fetch_array($result_poster))
        {
            $template['post_url'] = $forum_location .'/viewtopic.php?f='. $_posts['forum_id'] .'&p='. $_posts['post_id'] .'#p'. $_posts['post_id'];
            $template['post_subject'] = $_posts['post_subject'];
            $template['post_date'] = date($date_format, $_posts['post_time']);
            $template['post_text'] = str_ireplace(':'. $_posts['bbcode_uid'], '', $_posts['post_text']);
            $events=array(
                    $dato=substr($template['post_subject'],1,10),
                    $link=$template['post_url'],
                    $subject=substr($template['post_subject'],12),
                    $text=substr($template['post_text'],0,200)
                        );
        }
    }
}

function eventCmp($a, $b)
{
    if ($a['dato'] == $b['dato']) {
        return 0;
    }
    return ($a['dato'] < $b['dato']) ? -1 : 1;
}

$a=usort($events, "eventCmp");

foreach ($events as $key => $value)
{
    echo "$key: $value\n";
}

?>
Avatar billede eaglewing Nybegynder
13. maj 2008 - 16:25 #11
Ok, ændrede det så til dit senete forslag og nu er output tekst: 0: Array 1: Array 2: Array

Altså ser det udtil det del er bedre nu, så mangler der vidst kun post/sortering af de arrays den kommer med?
Avatar billede eaglewing Nybegynder
13. maj 2008 - 16:27 #12
Opdateret kode:
-------------------
<?
$db=mysql_connect ("xxxxxx", "xxxxxxxxx", "xxxxxxxxxxxx") or die ('I cannot connect to the database because: ' . mysql_error());
mysql_select_db ("pryo_phpbbaoc");

$phpbb_prefix="phpbb_";
$news_forum="56";
$forum_location="../phpbb";

$sql_topic = 'SELECT forum_id, topic_id, topic_first_post_id FROM `'.$phpbb_prefix.'topics` WHERE forum_id = '.$news_forum.' ORDER BY topic_id ASC';
$result_topic = mysql_query($sql_topic) or die('Error: TOPIC SQL');
while ($_topic = mysql_fetch_array($result_topic))
{
    $sql_posts = 'SELECT * FROM `'.$phpbb_prefix.'posts` WHERE post_id = '. $_topic['topic_first_post_id'] .' AND post_approved = 1';
    $result_posts = mysql_query($sql_posts) or die('Error: POSTS SQL');
    while ($_posts = mysql_fetch_array($result_posts))
    {
        $user_id = $_posts['poster_id'];
        $sql_poster = 'SELECT * FROM `'. $phpbb_prefix .'users` WHERE user_id = '.$user_id;
        $result_poster = mysql_query($sql_poster) or die('Error: USERS SQL');
        while ($_poster = mysql_fetch_array($result_poster))
        {
            $template['post_url'] = $forum_location .'/viewtopic.php?f='. $_posts['forum_id'] .'&p='. $_posts['post_id'] .'#p'. $_posts['post_id'];
            $template['post_subject'] = $_posts['post_subject'];
            $template['post_date'] = date($date_format, $_posts['post_time']);
            $template['post_text'] = str_ireplace(':'. $_posts['bbcode_uid'], '', $_posts['post_text']);
            $events[] = array(
                    'dato' => substr($template['post_subject'],1,10),
                    'link' => $template['post_url'],
                    'subject' => substr($template['post_subject'],12),
                    'text' => substr($template['post_text'],0,200));
        }
    }
}

function eventCmp($a, $b)
{
    if ($a['dato'] == $b['dato']) {
        return 0;
    }
    return ($a['dato'] < $b['dato']) ? -1 : 1;
}

$a=usort($events, "eventCmp");

foreach ($events as $key => $value)
{
    echo "$key: $value\n";
}

?>
-----------------------
Output: 0: Array 1: Array 2: Array
Avatar billede dkfire Nybegynder
13. maj 2008 - 16:30 #13
Prøv at rette:
foreach ($events as $key => $value)
{
    echo "$key: $value\n";
}

Til:
foreach ($events as $key => $value)
{
    echo "Post $key: <br>\n";
    echo "Dato: {$value['dato']}<br>\n";
    echo "Subject: {$value['subject']}<br>\n";
}
Avatar billede eaglewing Nybegynder
13. maj 2008 - 16:34 #14
Pefekt! nu virker det :) i har begge taget del i koden, så laver i et svar begge to? :)
Avatar billede dkfire Nybegynder
13. maj 2008 - 16:40 #15
Et svar fra mig ;-)
Avatar billede jakobdo Ekspert
13. maj 2008 - 18:57 #16
Svar!
Avatar billede eaglewing Nybegynder
13. maj 2008 - 22:23 #17
Takker for hjælpen :)
Avatar billede jakobdo Ekspert
13. maj 2008 - 22:26 #18
Takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester