Avatar billede venchil Nybegynder
10. marts 2006 - 17:50 Der er 15 kommentarer og
1 løsning

Arrays, der følger hinanden

Hej eksperter!
Jeg har et lille problem, som jeg har eksperimenteret med de sidste par dage... Jeg har f.eks 2 arrays, og det ene skal sorteres alfabetisk, men jeg vil gerne have det andet til at følge med, uden at det også skal sorteres alfabetisk...

$array1 = array("c", "b", "a");
$array2 = array("hej", "med", "dig");

Altså vil jeg gerne have "c" til at følge med "hej", ligemeget hvor i arrayet værdien havner. Så hvis "c" havner i $array1[2], så skal "hej" også havne i $array2[2], og så videre, hvis i forstår hvad jeg mener.

Hvordan gør man dette?
Avatar billede fixxxer Nybegynder
10. marts 2006 - 17:57 #1
Lav et samlet multidemisionalt array af de to samlet:

$samlet_array = array(array("c", "hej"), array("b", "med"), array("a", "dig"));

foreach ($data as $key => $row) {
  $keys[$key]  = $row[0];
  $values[$key] = $row[1];
}

array_multisort($keys, SORT_DESC, $values, SORT_ASC, $samlet_array);


Du kan måske nøjes med at give dem en fælles nøgle?

$array1 = array(1=>"c", 2=>"b", 3=>"a");
$array2 = array(1=>"hej", 2=>"med", 3=>"dig");


Om array_multisort http://dk2.php.net/manual/en/function.array-multisort.php
Avatar billede venchil Nybegynder
10. marts 2006 - 18:03 #2
Det ser lovende ud... Men hvordan udskriver jeg så? $values[0] osv.???
Avatar billede fixxxer Nybegynder
10. marts 2006 - 18:23 #3
Ved at gøre det multidemesionelt $values[0][0] = 'c', $values[0][1] = 'hej' osv.
Avatar billede coderdk Praktikant
10. marts 2006 - 23:08 #4
Hvad med at binde dem rigtigt sammen? Altså bruge et associativt array?
$array = array( "c" => "hej", "b" => "med", "c" => "dig" );
Avatar billede fixxxer Nybegynder
11. marts 2006 - 15:05 #5
coderdk >> Jeg har tolket det som om han faktisk vil bygge et 3 demesionelt array, og sortere på dette - hvis jeg har misforstået det, er din model klart at foretrække.
Avatar billede venchil Nybegynder
12. marts 2006 - 13:20 #6
OK... Kan ikke rigtig få noget ud af nogen af jeres forslag, så jeg tager lige og forklarer det hele lidt mere gennemskueligt:

Jeg har disse arrays:

$yourfiles = array("test1", "test2", "test3");
$yorfiles_end = array("html", "php", "css");
$yourfiles_filesize = array("500", "2000", "350");
$yourfiles_updated = array("01-01-1970", "02-02-1971", "03-03-1972");

Dette er bare fil- navne og informationer som jeg har hevet ud... Men når jeg udskriver dem, vil jeg gerne have alt til at listes efter fil-typen, altså "$yourfiles_end", sådan at alle php-filer kommer til at stå ved siden af hinanden, hvis i forstår hvad jeg mener? Efterfulgt at en anden fil-type. Det hele må selvfølgelig gerne være alfabetisk.

Men hvordan er det så lige at jeg gør det? :D
Avatar billede coderdk Praktikant
12. marts 2006 - 13:44 #7
F.eks.:

<?php

    $files = array(
        array(
            "name" => "test1"
            ,"end" => "html"
            ,"size" => "500"
            ,"date" => "01-01-1970"
        )
        ,array(
            "name" => "test2"
            ,"end" => "php"
            ,"size" => "2000"
            ,"date" => "02-02-1971"
        )
        ,array(
            "name" => "test3"
            ,"end" => "css"
            ,"size" => "350"
            ,"date" => "03-03-1972"
        )
      );
   
    function sortByExtension( $e1, $e2 )
    {
        if ( $e1['end'] == $e2['end'] )
        {
            return 0;
        }
        return ( $e1['end'] < $e2['end'] ) ? -1 : 1;
    }
   
    usort( $files, "sortByExtension" );
   
    echo "<pre>"; var_dump( $files ); echo "</pre>";
 
?>
Avatar billede venchil Nybegynder
12. marts 2006 - 14:12 #8
Det virker efter hensigten, men jeg har et lille problem med at få det integreret i mit script, før fik jeg det hele op i mine arrays på denne her måde:

    $dirname = "/";

    $yourfiles = array();
    $yourfiles_end = array();
    $yourfiles_filesize = array();
    $yourfiles_updated = array();
   
    $opendir=opendir("./".$dir."/");
    while (false !== ($file = readdir($opendir))) {
      if($file != "." && $file != "..") {
        $file_exploded = explode(".", $file);
        $yourfiles[] = $file_exploded[0];
        $yourfiles_end[] = $file_exploded[1];
        $yourfiles_filesize[] = filesize($file);
        $yourfiles_updated[] = date("d.m.Y", filemtime($file));
        }
    }
    closedir($handle);

Hvordan kan jeg så gøre det samme med den nye metode, har prøver at udskifte $yourfiles[] med $files[]["name"], og $yourfiles = array(); med $files = array();, men det virker ikke... Har du også en løsning på dette? I såfald må du meget gerne lægge et svar :D
Avatar billede coderdk Praktikant
12. marts 2006 - 14:17 #9
$dirname = "/";

    $files = array();
 
    $opendir=opendir("./".$dir."/");
    while (false !== ($file = readdir($opendir))) {
      if($file != "." && $file != "..") {
        $tmp = array()
        $file_exploded = explode(".", $file);
        $tmp['name'] = $file_exploded[0];
        $tmp['end'] = $file_exploded[1];
        $tmp['size'] = filesize($file);
        $tmp['date'] = filemtime($file);
        $files[] = $tmp;
        }
    }
    closedir($handle);

Bemærk at jeg har ændret "date" til blot filemtime, så kan du sortere på den - Så skal du blot bruge date("d.m.Y", $files[$i]['date']) for at præsentere det...
Avatar billede venchil Nybegynder
12. marts 2006 - 14:21 #10
Takker... Bare læg et svar...

Lige en sidste ting: Hvordan udskriver jeg så nu? Synes ikke at:

    echo $files[0]['size'];

Virker... :(
Avatar billede coderdk Praktikant
12. marts 2006 - 14:42 #11
Hmm jo, det burde da virke:

$n = count( $files );
for ( $i = 0; $i < $n; $i++ )
{
  echo $files[$i]['name'] . " " . $files[$i]['size'] . " bytes<br>";
}

Husk, du kan altid se strukturen med:

echo "<pre>"; var_dump( $files ); echo "</pre>";
Avatar billede venchil Nybegynder
12. marts 2006 - 14:45 #12
Hmmm... Der er altså stadig et eller andet galt:

<?php

    $dirname = "/";

    $files = array();

    $opendir=opendir("./".$dir."/");
    while (false !== ($file = readdir($opendir))) {
      if($file != "." && $file != "..") {
        $tmp = array()
        $file_exploded = explode(".", $file);
        $tmp['name'] = $file_exploded[0];
        $tmp['end'] = $file_exploded[1];
        $tmp['size'] = filesize($file);
        $tmp['date'] = filemtime($file);
        $files[] = $tmp;
        }
    }
    closedir($handle);

    $n = count( $files );
    for ( $i = 0; $i < $n; $i++ )
    {
          echo $files[$i]['name'] . " " . $files[$i]['size'] . " bytes<br>";
    }

?>

Det giver intet output :( - blank side
Avatar billede venchil Nybegynder
12. marts 2006 - 14:49 #13
Tror jeg har fundet fejlen... Der mangler en ; efter arrayet i $tmp, tester lige :)
Avatar billede coderdk Praktikant
12. marts 2006 - 14:51 #14
For det første giver det ikke så megen mening at sætte $dirname = "/" - du bruger den ikke, og opendir bruger $dir så den prøver at åbne ".//"... Men prøv da lige at se hvad den skriver, hvis du prøver at debugge lidt:

    while (false !== ($file = readdir($opendir))) {
      if($file != "." && $file != "..") {
        echo "Fandt $file<br>";
...

(echo sat ind)

Virker filesize/filemtime i det loop?
Jeg ville gøre således:

<?php

    $dir = "/";

    $files = array();
    $dir = "." . $dir;

    $opendir=opendir($dir);
    while (false !== ($file = readdir($opendir))) {
      if($file != "." && $file != "..") {
        $tmp = array()
        $file_exploded = explode(".", $file);
        $tmp['name'] = $file_exploded[0];
        $tmp['end'] = $file_exploded[1];
        $tmp['size'] = filesize($dir.$file);
        $tmp['date'] = filemtime($dir.$file);
        $files[] = $tmp;
        }
    }
    closedir($handle);

    $n = count( $files );
    for ( $i = 0; $i < $n; $i++ )
    {
          echo $files[$i]['name'] . " " . $files[$i]['size'] . " bytes<br>";
    }

?>

Her antager jeg at du sætter $dir - og at den altid slutter med /
Avatar billede coderdk Praktikant
12. marts 2006 - 14:51 #15
Ah :)
Avatar billede coderdk Praktikant
12. marts 2006 - 14:52 #16
Ja, i mit eksempel mangler ; stadig :)
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