Autor Zpráva
kokolino
Profil
čawte
mám problém zistiť či sú všetky záznamy v tabuľke rovnaké
v súbore mám
000 mul
010 mul
020 mula
030 mul

toto si pekne vypíšem to tabuľky ako mi poradil/a predtým Tori

a teraz, keď sa snažím zistiť, či sú všeky záznamy rovnaké tak mi to nejde
<?php 
$auto = file("janko.txt", FILE_SKIP_EMPTY_LINES);
$auto = str_replace("\r\n",' ',$auto);
$mul="mul";

foreach($auto as $line)
{
    $okno=explode(' ',$line);
	if(trim($okno[1]!=mul)) 
	{echo"<font color='blue'>&nbsp;je tu nezhoda</font>"; $vypis=2;}
	else $vypis=1;
}
if($vypis==1){echo"<br><font color='red'>všetko je rovnaké</font>";}
elseif($vypis==2){echo"<br><font color='purple'>veci sa nezhoduju</font>";}
?>


na výstupe dostanem obe hlášky :
ta prvá je kvôli tomu, že v súbore na riadku 3 je mula a nie mul, takže dostanem na výstup "je tu nezhoda" a nastavím $vypis=2
ale kedže na riadku 4 je opäť mul čo vyhovuje podmienke tak $výpis sa nastaví na 1 a dostanem aj hlášku "všetko je rovnaké"
skúsil som to na riadku 10 zastaviť takto
{echo"<font color='blue'>&nbsp;je tu nezhoda</font>"; $vypis=2;exit;}

ale potom nedostanem vôbec žiadny výstup.

predom Vám ďakujem za pomoc a trpezlivosť so mnou
Tori
Profil
Místo exit jste možná myslel break? Na řádku č.9 posíláte funkci trim logickou hodnotu (výsledek porovnání), místo řetězce.

Co se týká logiky - proměnnou $vypis bych definovala ještě před cyklem na hodnotu "všechno se shoduje". Pokud pak uvnitř foreach najdete neshodu, jen změníte hodnotu $vypis a ukončíte cyklus. V případě odlišného textu tak nemusíte procházet všechny řádky, ale jen po první odlišný.

(Ještě by se to pak dalo vylepšit tak, abyste nezadával napevno hodnotu $mul, ale aby se načetla z prvního řádku.)
Joker
Profil
kokolino:
Jednak na řádku 9 chybí dolar:
    if(trim($okno[1]!=$mul)) 

a jednak takhle to de facto testuje jenom poslední řádek, resp. na každém řádku to přepíše hodnotu $vypis. Příkaz exit není vhodný, protože ukončí provádění celého skriptu.
$vypis=1 se musí nastavit před cyklem a uvnitř už ne (jen $vypis=2 v případě nalezení neshody).

Krom toho po nalezení první neshody je zbytečné už dál pokračovat.
A ještě k proměnné $vypis, údaj typu ano/ne není vhodné namapovat do číselné proměnné na hodnoty 1 a 2. Lepší je použít boolean a true a false.
petr 6
Profil
Místo exit použij break. To by mělo stačit.

Ale možná by to šlo řešit elegantněji, kdybys přesně popsal, co očekáváš, že tvůj skript bude dělat.

Edit: Pozdě. Elegantnější řešení nabízejí přispěvatelé nade mnou. Navíc jsem si nevšim té chyby na řádku 9.
kokolino
Profil
Ďakujem Vám všetkým trom za reakciu ja som to riešil pár hodín a vy ste to vyriešili s časovým odstupom od seba za pár minút.

Tori:
ďakujem na riadku 9 som si vážne nevšimol ten preklep
čo sa týka breaku, ja som ho stále použival len pri switch a while , nevedel som, že sa dá použiť aj pri vetvení if else
$vypis ma nenapadlo dať ešte pred cyklus (teraz sa cítim ako somár)

(Ještě by se to pak dalo vylepšit tak, abyste nezadával napevno hodnotu $mul, ale aby se načetla z prvního řádku.)
tak toto b bolo úplne super, ale neviem ako na to.

Joker:
"A ještě k proměnné $vypis, údaj typu ano/ne není vhodné namapovat do číselné proměnné na hodnoty 1 a 2. Lepší je použít boolean a true a false."
toto mi už doporučilo viac ľudí, bohužial nie celkom chápem ako by som to mal prepísať preto to riešim cez čísla.

petr 6:
predstavte si mriežku 8x8, každa bunka predstavuje pamäťovú jednotku, čiže máme 64 pamäťových jednotiek, každá pamäťová jednotka má n-registrov
mojou úlohou je nájsť algortimus mapovania inštrukcií do tých registrov

riešim to takto:
1. najprv som si spravil tú mriežku (s tým ste mi pomohli Vy a Tori)
2. teraz som si určil, že každá pamäť bude mať práve 2 registre (0,1)
3.do registrov 0 som si všade globálne namapoval inštrukciu mul(može tam byť lubovolný text) čiže som tam priviedol ako keby konštantu to som potreboval overiť či je na 64 miestach rovnaká hodnota. Toto sme vyriešili teraz.
Teraz to budem musieť ešte zapísať (mám danú presnú formu)

ešte ma čaká
4. do registra 1 budem mapovať maskou nejaké inštrukcié (opäť môže byť lubovolný text) napr. 10 rovnakých inštrukcií a budem musieť zistiť ich pozíciu (predstavujem si to ako keby išlo o detekciu figúrky na šachovnici) a ak zistím ,že sú susedné budem ich musieť popísáť na báze karnaughových máp
zase mám presne definovanú formu zápisu.

5. do registra 1 si dám jednu inštrukciu (alebo viac) a budem musieť zistiť jej pozíciu a opäť ju zapísať presne definovanou formou zápisu.

Toto je komplexná úloha, ktorú mám vyriešiť.
Ja to riešim po krokoch ako som to naznačil a na Vás sa tu obraciam ak si neviem dať rady, alebo nemám predstavu ako na to.
Samozrejme sa stále snažím spraviť niečo sám, aby som Vám mohol načrtnút svoje nie vždy správne myšlienkové pochody.
petr 6
Profil
kokolino:
to som potreboval overiť či je na 64 miestach rovnaká hodnota

Nebylo jednodušší si těch 64 prvků dát do pole a spočítat unikátní hodnoty?
Tori
Profil
kokolino:
čo sa týka breaku, ja som ho stále použival len pri switch a while , nevedel som, že sa dá použiť aj pri vetvení if else
Pozor, to se nedá. V tomto případě break ukončuje cyklus foreach, nikoli if-else. Pokud byste chtěl udělat něco takového:
if ($podminka)  {
  $x = udelejNeco();
  if ($x == false)
    break; // tohle zahlásí chybu použití break mimo cyklus.
  udelejNecoJineho($x);
}
, musíte celou podmínku zabalit do cyklu, např. do-while:
do {
  if ($podminka)  {
    $x = udelejNeco();
    if ($x == false)
      break; // tohle už je v pořádku.
    udelejNecoJineho($x);
  }
} while (false);
(Podmínka opakování cyklu musí být vyhodnocena jako false, aby se cyklus opakoval jen jednou. Jestli dáte přímo false nebo třeba 1==0, je myslím jedno.)

edit:
(Ještě by se to pak dalo vylepšit tak, abyste nezadával napevno hodnotu $mul, ale aby se načetla z prvního řádku.)
tak toto b bolo úplne super, ale neviem ako na to.
$mul = '???'; // cokoli, co se určitě nevyskytne v registru
foreach (foreach($auto as $line)
{
    $okno=explode(' ',$line);
    if ($mul == '???') $mul = trim($okno[1]);
    if (trim($okno[1]) != $mul)  // atd.

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: