Autor Zpráva
Dotaz15825
Profil *
Zdravíčko,
měl bych na Vás menší dotaz.
Udělal jsem si script, který otevře všechny soubory ve složce, pomocí explode rozkouskuje obsah souboru a vypíše hodnotu, kterou chci já.
Ale těch souborů je přes 1000 a když vypisuji ty hodnoty, tak bych je potřeboval seřadit od nejvyššího po nejmenší.
S kamarádem jsme zkoušeli už dost možností, ale ani jedna nefungovala.
Poradil by mi někdo prosím?
Děkuji.
Joker
Profil
To je celkem triviální, uložit si je do pole a pak setřídit to pole.
Na třídění od nejvyššího po nejmenší je rsort
Dotaz15825
Profil *
[#2] Joker
No právě to mi nejde.
Alphard
Profil
No, kříšťálovou kouli plánujeme až na Vánoce... máte nevhodnou strukturu pole, nebo sort funkce používáte blbě. Funkce samotné určitě fungují :-)
Dotaz15825
Profil *
nevhodnou strukturu pole
Tomu nerozumím. :D
Lkopo
Profil *
Napíšte prosím sem Váš zdrojový kód, aby sme mohli chybu analyzovať.
Dotaz15825
Profil *
Jak jsem říkal, vypisuje mi to 2 hodnoty.
$arr = array($hodnota=>$hodnotaa);
rsort($arr);
echo $arr;
echo "</br>";
Je to podle YT.. Fakt už nevim.
han5vk
Profil
Toto nie sú 2 hodnoty ale index a hodnota. Dve hodnoty by boli array($hodnota,$hodnotaa) prípadne array('index1'=>$hodnota, 'index2'=>$hodnotaa). Nefunguje ti to pretože jeden prvok sa zoradiť inak nedá.
Lkopo
Profil *
Môžeš max. nájsť ako viacrozmerne polia triediť podľa určitej hodnoty. Napr. tu - http://stackoverflow.com/questions/2699086/sort-multidimensional-array-by-value-2
Dotaz15825
Profil *
Aha, takže to teda nejde? Ta první proměnná je název souboru a ta druhá je ten obsah co z toho souboru vytahuju.. A právě ten potřebuju seřadit..
Alphard
Profil
U vícerozměrného pole se můžete odkázat přímo na klíč, pod kterým je pole, které se má řadit.
rsort($arr['nazevSouboru']);
Medvídek
Profil
Dotaz15825:

Nešlo by to nějak takto? Tedy projít všechny ty soubory a postupně ty hodnoty co Vás zajímají přidávat do pole?

$result = array();
foreach (glob("*.txt") as $filename) {
    $temp = file_get_contents($filename);
    $temp = explode($separator,$temp);
    $result[] = $temp[5];
}
rsort($result);
Dotaz15825
Profil *
A u té array má být $neco, $neco, nebo $neco=>$neco?


Medvídek:
Zkusím, zatím díky.


Medvídek:
Bohužel, nejde. Napíše mi to ArrayArrayArray.
Medvídek
Profil
Dotaz15825:
Vytvořil jsem si přes 200 testovacích souborů, kde je obsahem string, kde jsou náhodná čísla oddělené separatorem:

for($a=0;$a<222;$a++){
    $string = rand(0,99999)."|".rand(0,99999)."|".rand(0,99999)."|".rand(0,99999)."|".rand(0,99999);
    file_put_contents("soubor_".$a.".txt",$string);
}

Poté nad tím spustil tento skript:

$separator = "|";
$result = array();
foreach (glob("*.txt") as $filename) {
    $temp = file_get_contents($filename);
    $temp = explode($separator,$temp);
    $result[] = $temp[2];
}
rsort($result);
echo '<pre>';
print_r($result);

A správně to vrátí výsledek jednoho pole, kde jsou seřazeny všechny hodnoty:

Array
(
    [0] => 99957
    [1] => 99752
    [2] => 99392
    [3] => 98532
    [4] => 98019
    [5] => 97857
    [6] => 97604
    [7] => 97586
    [8] => 97329
    [9] => 96520
    [10] => 95968
    [11] => 95681
    [12] => 93295
    [13] => 92675
    [14] => 92480
    [15] => 91314
    [16] => 91162
    [17] => 90869
    [18] => 90802
    atd ...

V případě potřeby více hodnot takto:

$separator = "|";
$result = array();
foreach (glob("*.txt") as $filename) {
    $temp = file_get_contents($filename);
    $temp = explode($separator,$temp);
    $result[] = array("foo" => $temp[2], "bar" => $temp[4]);
}


function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
    $sort_col = array();
    foreach ($arr as $key=> $row) {
        $sort_col[$key] = $row[$col];
    }

    array_multisort($sort_col, $dir, $arr);
}


array_sort_by_column($result, 'bar');

echo '<pre>';
print_r($result);

Výsoledek seřazený podle hodnot s klíčem bar jako ASC, změnou SORT_ASC za SORT_DESC změníte pořadí.

Array
(
    [0] => Array
        (
            [foo] => 82751
            [bar] => 225
        )

    [1] => Array
        (
            [foo] => 45819
            [bar] => 451
        )

    [2] => Array
        (
            [foo] => 30007
            [bar] => 1217
        )

    [3] => Array
        (
            [foo] => 60772
            [bar] => 1831
        )

    [4] => Array
        (
            [foo] => 13235
            [bar] => 2609
        )

    [5] => Array
        (
            [foo] => 76110
            [bar] => 2960
        )

    [6] => Array
        (
            [foo] => 219
            [bar] => 3143
        )
Dotaz15825
Profil *
Hm, tak já fakt nevím..
Mám prostě soubor Něcoxx.txt a v něm:
14
51,52,0,3
1,2
Z toho řádku, kde je ta 1,2 beru 1 a pak vypisuji název souboru + tu jedničku a tu jedničku potřebuju seřadit od největšího, po nejmenší.. Ale podle toho, co jsi mi dal(upravil jsem si to) mi to prostě neseřadí..
Medvídek
Profil
Dotaz15825:
Ještě si asi nerozumíme. Máte jeden soubor, v něm hledáte všechny čísla oddělený čárkou a ty pak chcete seřadit, nebo máte více souborů se strukturou co jste poslal a hledáte vždy první číslo na řádku 3? Pořád nechápu, jakou máte strukturu souborů a obsah a podle čeho se vlastně řídíte.
Dotaz15825
Profil *
Souborů je přes 1200 - každý se jmenuje jinak a každý má jiný obsah souboru a u každého vytahuji první hodnotu na třetím řádku ze zhora.
Medvídek
Profil
Dotaz15825:
Tak už jsme doma, v tom případě bych to udělal takto:

$result = array();
foreach (glob("*.txt") as $filename) {
    $temp = file_get_contents($filename);
    $temp = explode(PHP_EOL,$temp);//rozdelime si soubor na radky
    $temp = $temp[2]; //3 radek
    $temp = explode(",",$temp);//rozdelime si 3 radek na cisla podle carky (jeste bych dal treba kontrolu jestli se carka vyskytuje)
    $result[] = array("number" => $temp[0], "file" => $filename);
}


function array_sort_by_column(&$arr, $col, $dir = SORT_DESC) {
    $sort_col = array();
    foreach ($arr as $key=> $row) {
        $sort_col[$key] = $row[$col];
    }

    array_multisort($sort_col, $dir, $arr);
}


array_sort_by_column($result, 'number');

echo '<pre>';
print_r($result);


Výsledek u mě:

Array
(
    [0] => Array
        (
            [number] => 99844
            [file] => soubor_9.txt
        )

    [1] => Array
        (
            [number] => 99694
            [file] => soubor_42.txt
        )

    [2] => Array
        (
            [number] => 99560
            [file] => soubor_78.txt
        )

    [3] => Array
        (
            [number] => 99295
            [file] => soubor_53.txt
        )

    [4] => Array
        (
            [number] => 96640
            [file] => soubor_151.txt
        )

    [5] => Array
        (
            [number] => 96066
            [file] => soubor_155.txt
        )

Obsah náhodnéhou souboru:

soubor_9.txt
51342
46536,46063,49191,51086
99844,12896
Dotaz15825
Profil *
Super, toto už funguje. Akorát, když tam hodím jen echo, aby mi to pod sebe vypsalo seřazená čísla, nefungjue.
Ale děkuji moc za pomoc :)
Medvídek
Profil
Dotaz15825:
Výsledek máte v poli, s tím už si dělejte co potřebujete, pokud jde jen o vypsání čísel a názvů souborů, tak třeba:

foreach($result AS $val){
   echo $val["number"]." - ".$val["file"]."<br />";
}

Výsledek:

99844 - soubor_9.txt
99694 - soubor_42.txt
99560 - soubor_78.txt
99295 - soubor_53.txt
96640 - soubor_151.txt
96066 - soubor_155.txt
95874 - soubor_118.txt
95504 - soubor_35.txt
95449 - soubor_105.txt
95397 - soubor_170.txt
95086 - soubor_164.txt

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: