Autor Zpráva
etexweb
Profil
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
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 shoduje neshoduje s tou předchozí, zvýšíte číslo pořadí. Uložíte aktuální položku do $předchozí, vypíšete číslo pořadí. Konec cyklu.

oprava: Definice prvního čísla musí být o 1 menší, bo se nejdřív přičítá a pak zobrazuje.
Taps
Profil
etexweb:
chápu správně že mají být zachovány duplicity ?
etexweb
Profil
Tori:
Vymysliet funkciu je jednoduché, horšie je to zo zostavením kódu.
Taps:
Áno duplicity musia byť zachované.
Tori
Profil
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
Tori:
Samozrejme, že si to vymyslela skeve, no ja neviem ako ten script zostaviť.
Tori
Profil
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
Ď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
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
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
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
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
Ale čo ak je týchto hodnôt viac ako 30 000 ?
Tori
Profil
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
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
Už som to vyriešil :) Bolo to hotové asi tak za 3 minúty. Díki
Toto téma je uzamčeno. Odpověď nelze zaslat.

0