Autor | Zpráva | ||
---|---|---|---|
etexweb Profil |
#1 · Zasláno: 3. 6. 2011, 19:26:12 · Upravil/a: etexweb
Ako v php spraviť text do císelneho poradia ?
Z takéhoto: Tartu Tartu Valga Oromia Viljandi Viljandi Amhara Amhara Na takéto: 1 1 2 3 4 4 5 5 |
||
Tori Profil |
#2 · Zasláno: 3. 6. 2011, 19:41:58 · Upravil/a: Tori
Definujete si číslo, které se má zobrazit jako první v pořadí minus jedna, a prázdnou proměnnou $předchozí . Pak cyklem projdete všechny položky textového seznamu/pole: Pokud se aktuální položka
oprava: Definice prvního čísla musí být o 1 menší, bo se nejdřív přičítá a pak zobrazuje. |
||
Taps Profil |
#3 · Zasláno: 3. 6. 2011, 19:42:13
etexweb:
chápu správně že mají být zachovány duplicity ? |
||
etexweb Profil |
#4 · Zasláno: 3. 6. 2011, 19:47:06 · Upravil/a: etexweb
Tori:
Vymysliet funkciu je jednoduché, horšie je to zo zostavením kódu. Taps: Áno duplicity musia byť zachované. |
||
Tori Profil |
#5 · Zasláno: 3. 6. 2011, 20:13:14
etexweb:
„Vymysliet funkciu je jednoduché, horšie je to zo zostavením kódu.“ Však jsem jen lidskou řečí popsala kód řádek po řádku, co je na tom? Zkoušela jsem to teď, funguje. (Nevylučuji možnost, že se vyjadřuji nesrozumitelně, stává se mi to.) |
||
etexweb Profil |
#6 · Zasláno: 3. 6. 2011, 20:14:55 · Upravil/a: etexweb
Tori:
Samozrejme, že si to vymyslela skeve, no ja neviem ako ten script zostaviť. |
||
Tori Profil |
#7 · Zasláno: 3. 6. 2011, 20:29:03
Nechtěla jsem pochvalu a cukrík, ale doufala jsem, že to zkusíte. Oki, tak i s překladem ;-)
$orig = array('Tartu', 'Tartu', 'Valga', 'Oromia','Viljandi','Viljandi','Amhara','Amhara'); // Definujete si číslo, které se má zobrazit jako první v pořadí minus jedna $i = 0; // a prázdnou proměnnou $předchozí $prev = ''; // Pak cyklem projdete všechny položky textového seznamu/pole: foreach($orig as $curr) { // Pokud se aktuální položka neshoduje s tou předchozí if ($curr != $prev) { // zvýšíte číslo pořadí $i++; } // Uložíte aktuální položku do $předchozí $prev = $curr; // a vypíšete číslo pořadí. Konec cyklu. echo "$i "; } |
||
etexweb Profil |
#8 · Zasláno: 3. 6. 2011, 21:06:48 · Upravil/a: etexweb
Ďakujem, upravil som to tak aby mi to hodnoty čítalo zo súboru.
<? $file = "data.csv"; $files = file($file); $i = 0; $prev = ''; foreach($files as $curr) { if ($curr != $prev) { $i++; } $prev = $curr; echo $i."<br>"; } |
||
etexweb Profil |
#9 · Zasláno: 3. 6. 2011, 21:23:37 · Upravil/a: etexweb
Mám ešte jeden TIP, ako z: // na:
A|SK // 1 A|SK // 1 B|SK // 2 C|SK // 3 A|CY // 1 B|CY // 2 B|CY // 2 (Hodnoty by mali byť čítané cez explode) |
||
Tori Profil |
#10 · Zasláno: 3. 6. 2011, 21:58:54
etexweb:
No a jak jste to zatím zkoušel? Bude tedy asi potřeba useknout z každého řádku začátek, ten někde uložit spolu s číslem pořadí. Btw nemusí být nutně explode, stačí použít $zacatek = substr($cely_text, 0, strpos($cely_text, '|')); |
||
etexweb Profil |
#11 · Zasláno: 4. 6. 2011, 12:52:47
Zatial so mám takto,ale nejde to správne:
<? $file = "data.csv"; $files = file($file); $i = 0; $prev = ''; $back = ''; Foreach($files as $curr) { $hod = explode("|",$curr); If ($curr != $prev) { $i++; }Else If ($hod[0] = $back) { $i = 0; $i++; } $prev = $curr; $back = $hod[0]; echo $i." // ".$hod[0]."|".$hod[1]."<br>"; } Vypisuje: 1 // A|CO 1 // A|CO 1 // A|CO 2 // B|CZ 1 // B|CZ 1 // B|CZ 2 // C|SK 1 // C|SK 1 // C|SK 2 // X|SK 3 // A|SK |
||
Tori Profil |
#12 · Zasláno: 4. 6. 2011, 13:03:14 · Upravil/a: Tori
Změnila bych $back na asoc. pole, kde klíčem budou ty fragmenty textu a hodnotou číslo pořadí. Při každém opakování cyklu pak zjistíte, jestli existuje takový klíč v poli. Pokud ne, tak ho vytvoříte a uložíte do něj číslo pořadí (nejdřív se má zvětšit o jednu a pak teprv uložit, takže ++$i). Pak už jen čtete číslo pořadí jako $pole[$fragment].
Na konci tedy dostanete asi takovéhle pole: $pole = array('A'=>1, 'B'=>2, 'C'=>3, 'X'=>4); |
||
etexweb Profil |
#13 · Zasláno: 4. 6. 2011, 13:21:04
Ale čo ak je týchto hodnôt viac ako 30 000 ?
|
||
Tori Profil |
#14 · Zasláno: 4. 6. 2011, 13:29:29
etexweb:
No, nevím, tak bude pole o 30k položkách? :) Nevím, čeho tím chcete dosáhnout, jaká data potřebujete dostat - asi by to šlo udělat i s menšími nároky na paměť. |
||
Alphard Profil |
#15 · Zasláno: 4. 6. 2011, 18:05:06
Paměť ušetříte, když budete používat fgets() místo, ale algoritmus musí být takový, aby nepotřeboval zpětně přístupovat k už projitým položkám. Nevím, co s tím dál provádíte, ale těžko budete vypisovat 30k řádků, takže by to chtělo podívat se na to komplexněji.
|
||
etexweb Profil |
#16 · Zasláno: 4. 6. 2011, 18:16:58
Už som to vyriešil :) Bolo to hotové asi tak za 3 minúty. Díki
|
||
Časová prodleva: 13 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0