Oszlopok szerinti sorbarendezés PHP-ban
Üdv. a Fórumozóknak !
Van egy egyszerű kérdésem, amit sajnos nem tudok kitalálni.
Van egy akármennyi sorból és N db oszlopból álló, | jellel elválasztott rendezett adatbázisom.
A Unixban van egy ilyen utasítás :
system ("/usr/bin/sort -t\\| -k4 -r -n $ut/dat/adatallomany.dat.bak -o $ut/dat/adatallomany.dat");
Ezt a sort a PERL nyelvű programba be lehet írni, ott működött.
Ezen paraméterek közül a -k4 jelenti, hogy a 4 oszlop elemei szerint, az -r pedig azt, hogy fordított sorrendben.
Kérdésem, hogy a PHP-ban van-e valamifajta sorbarendezést végző utasítás, amit hasonlóan lehet paraméterezni.
■ Van egy egyszerű kérdésem, amit sajnos nem tudok kitalálni.
Van egy akármennyi sorból és N db oszlopból álló, | jellel elválasztott rendezett adatbázisom.
A Unixban van egy ilyen utasítás :
system ("/usr/bin/sort -t\\| -k4 -r -n $ut/dat/adatallomany.dat.bak -o $ut/dat/adatallomany.dat");
Ezt a sort a PERL nyelvű programba be lehet írni, ott működött.
Ezen paraméterek közül a -k4 jelenti, hogy a 4 oszlop elemei szerint, az -r pedig azt, hogy fordított sorrendben.
Kérdésem, hogy a PHP-ban van-e valamifajta sorbarendezést végző utasítás, amit hasonlóan lehet paraméterezni.
usort Beolvasod egy tömbbe,
Beolvasod egy tömbbe, aztán írsz egy függvényt, ami úgy rendezi, ahogy neked jó.
Körülményesen, while, vagy
A kérdésem arra irányult, hogy a PHP-ban van-e olyan egyszerűen paraméterezhető utasítás, ami ezt elvégzi.
Pl. valami ilyesmi :
$adat=file("....../adatallomany.dat");
sort ( $adat, 3, SORT_NUMERIC); // itt a 3 az oszlopot jelentené, amely szerint rendezünk.
file_put_contents ("......./adatallomany.dat", $adat);
RTFM
Köszönöm, de ennél lényegesen
bash
system ("/usr/bin/sort -t\\|
Ezt a sort a PERL nyelvű programba be lehet írni, ott működött.
Sajnos ez nálam nem működik.
Mit jelent az, hogy nem
Ez nem működik nálam : system
system ("/usr/bin/sort -t\\| -k4 -r -n $ut/dat/adatallomany.dat.bak -o $ut/dat/adatallomany.dat");
Hibakeresés
exec()
parancsot. Emellett, ha látni szeretnéd a kimenetet, a parancssor végére írd be a következőt:2>&1
.Ugyan azon
Sajnos nem ismerem a pontos
Ez valószínűleg meg is
Köszönöm mindenkinek az
A rendszergazdám engedélyezte számomra a system () utasítást, így a sorbarendezési lehetőség egyszerűen megoldva.
Kár, hogy a PHP-ban ilyen rövid, egysoros megoldás nincs.
PHP
Jó, de azért lehetett volna a
Ez egy igen egyszerű dolog, az Excelben is pillanatok alatt lehet egy táblázatot előre-hátra, oda-vissza rendezni, ha oda betöltöm a kérdéses adatállományt.
A php-ban minden gyakran
Ez esetben a 4. számú
PHP
Dokumentáció
Vigyázz a gányolással, én nem
A PHP egy programnyelv. Ha kell ilyen funkció, és lusta vagy megírni, nézz körül a neten, biztos megírta már valaki.
Nem gányolás
Úgyhogy de, jelen esetben győz a kevesebb gépelés, csak arra kell figyelni, hogy a parancssorba beillesztett változók ellenőrizve legyenek.
Nem derült ki, mi a cél
Aki azért bekapcsoltatja a systemet, hogy sorbarendezzen, az nem fog ellenőrzéssel szórakozni, mert ahhoz bizony gépelni kell. Ráadásul ha most nem ad át változókat, akkor főleg nem fog ezzel szórakozni. Később, amikor gyorsan módosítani kell a kódon, pedig már nem fog eszébe jutni. Bang.
Te mit értesz gányolás alatt?
Érdekes én a hosszú távon nem fentartható megoldásokat szoktam gányolásnak nevezni, márpedig ez az egy sor bőven kielégíti ezt a definiciót. Kezdve attól, hogy magát a környezetet is fixálod, egész addig, hogy a negyedik oszlop szerint rendezed, ráadásul úgy, hogy egyszerre két process két különböző rendezést nem fog tudni benne használni.
pp
Premature optimization
:D
Ez jó volt.
BTW: Akkor nagy butaság volt
"sokkal hatékonyabbak, mint bármely scriptnyelv, vagy ha akár C-ben írnád meg ugyanezt"
Én a kód készítés optimalizációjáról beszéltem, mely feltételei nagyrészt ismertek, nem pedig a kód futás optimalizációjáról, aminek a feltételei nem ismertek.
Szerintem összekevered a kettőt. Igyekszem pontosabban fogalmazni, legközelebb, de nem látom, hogy miért is keverted össze a kettőt. Segítesz?
pp
Akkor nagy butaság volt az
Egyébként is miért lenne butaság? Megírhatod C-ben, ami piszok gyors lesz, de rengeteg munka. Shell-ben az az egy sor megoldja a feladatot, ezt csak annyival kell kiegészíteni, hogy paraméterezhető legyen. Erre tökéletesen megfelel egy bash script, ami rövidebb lesz, és járulékos következmény, hogy akár nagyságrendekkel gyorsabb, mint php-ban, hisz a linux parancssorát és parancsait pont ilyen adatfolyamok gyors feldolgozására találták ki.
A 23-as hozzászólásodban felvetett érveidre:
- Mennyi az esély arra, hogy áttérnek windowsra? Teljesen fölösleges általánosan megírni valamit, amíg egy ilyen horderejű változást meg nem csinálnak.
- Bash scriptben is lehet paramétereket, változókat kezelni.
- Egyszerre több kérést is el lehet indítani párhuzamosan, amit az operációs rendszer lekezel - php-ban ez jóval nehézkesebb.
Ráadásul itt van, ugye, Occam borotvája.
Ha már a híres borotvával
A tiszta php-s megoldás nem feltételez semmit, míg a
system()
hívás feltételez egy adott platformot. Ezek szerint a php-s változat előnyt kellene élvezzen.Plusz, ami a 22-esben le lett írva. Csak ezért bekapcsolni a
system()
-et és potenciális biztonsági réseket lehetővé tenni teljesen felesleges. Ha lassúnak bizonyul a php-s megoldás, akkor el lehet gondolkozni új függőség beépítésén, de addig ez csak premature optimization.Occamhoz idézet a magyar
Én a php-n már túlléptem, ezt többször is jeleztem, szerintem nem érdemes vele megoldani ezt a feladatot ennyi bejövő információ alapján.
„a többletet nem kell bevezetni szükségtelenül”
Abban egyetértünk, hogy ha a program egyetlen feladata, hogy egy ilyen állományt szigorúan csak a fenti (vagy shell scriptben hasonlóan egyszerűen leírható) feltételek szerint rendezzen, akkor tényleg nem a php a megfelelő eszköz.
A legjobb eset persze az, ha
De ha már PHP (egyéb okok miatt), akkor írja PHP-ban. Technikailag hívogathat egy rakás Python, meg Perl, meg Brainfuck, meg akármilyen scriptet, függően attól, adott részfeladatot melyik nyelven kevesebb billentyűleütés elkészíteni, csak attól ez még gány.
Occam beretvájával meg már annyiszor hadonásztál korábban is indokolatlanul és megalapozatlanul, hogy tényleg csak attól félek, nehogy megvágd magad vele.
Figy, Te most velem
"- Mennyi az esély arra, hogy áttérnek windowsra? Teljesen fölösleges általánosan megírni valamit, amíg egy ilyen horderejű változást meg nem csinálnak."
??? Ember olvasd végig a szálat. Vagy neked nem tűnt fel, hogy emberünknek tökre nem ment az amit próbált, csak azután, hogy megváltoztatták a környezetet amiben fut az alkalmazása??? Hogy jön ide a windows???
"- Bash scriptben is lehet paramétereket, változókat kezelni."
És? Én hol írom, hogy nem lehet??? Nekem azzal van bajom, hogy a negyedik oszlop szerint rendezel. Részemről ez kerülendő. Pusztán azért mert nem lesz egyszerűen megérthető a kód, mert bele kell túrni a fájlba, vagy a dokumentációba, hogy megértsd, hogy éppen ott mit is jelent a negyedik oszlop. Vagy 5.-ben Poetro miért teszi fel a kérdést? (és miért téveszti össze a 4. oszlopot a 3.-al :))
"Ráadásul itt van, ugye, Occam borotvája."
Ember, továbbra se tudjuk mi a feladat, Occam borotvájával így csak összeszabdaljuk magunkat, mint ahogyan Te is írod, vagy az a másik Hidvégi Gábor aki ezzel érvelt. (Ugyan az lenne a két ember?)
Továbbra is a gányolás definicióját várom tőled/tőletek, mert arra valamiért elfelejtettél/elfelejtettetek reagálni.
pp
Nehogy felhúzd magad a
Minden oké, jól vagy már?A
A környezeten én az operációs rendszert értettem, mivel a bash scriptben gondolkodtam.
Occam borotváját arra hoztam fel, hogy ha van már egy egyszerű, jól működő megoldás parancssorban, felesleges átírni php-re, mert csak vesztünk vele.
A te gányolás-definíciód teljesen rendben van, csak azt nem értem, miért rugózol rajta, hisz azt sem tudjuk, a feladatot milyen távra tervezik. Lehet, hogy jövő szombaton kell négy fájlt átkonvertálni a segítségével, utána eladják a szervert.
Megnyugtatna, ha leírnád Te
"És ezzel mi a baj?"
Olvass vissza a másik Hidvégi problémázott ezen.
pp
Gányolás
Köszönöm a
Tehát akkor azt állítod, hogy ez a munka nincs összecsapva, és újabb elvárások miatt nem kell majd jelentősen módosítani?
Mert ugye azt senki nem vitatta, én se, hogy ha egyszeri gyors megoldás kell, akkor egy kis gányolás még belefér, itt azon megy a vita, hogy az adott megoldás, gányolás avagy sem. Mert ugye ha tudjuk, hogy gányolás, akkor tudjuk, hogy ha hozzá kell nyúlni, akkor nagyon hozzá kell nyúlni.
"Visszaolvastam, de nem látom az ellentmondást abban, amit írtam."
Én azt írtam, hogy az alkalmazás fixálja a környezetet, értsd csak bizonyos környezetben képes futni. És mint ahogyan láttuk is a környezet amiben először futtatta a kérdező nem is volt megfelelő rá, ezért módosítani kellett a környezetet (engedélyezni kellett az adott fv-t). Tehát mind a környezet módosítás mind a környezet fixálás probléma, csak ugye nem mindegy, hogy melyik szövegkörnyezetből ragadjuk ki az adott szavakat, és állítjuk be úgy, mintha ellentmondás lenne, holott nincs. Kérlek olvasd el figyelmesen amit írok, és akkor nem keveredsz ellentmondásba önnmagaddal, mert nem tudom mivel vitatkozol, de nem azzal amit én leírtam.
pp
Ezt a munkát nem nevezhetjük
system()
függvény engedélyezéséig nem is futott le, azaz a feladatát nem végezte el, nem volt kész.Nem tudjuk, hogy András miért váltott perlről php-re. Perl alatt a
system()
engedélyezve volt, tehát a php script pontosan ugyanolyan biztonsági kockázatokat hordoz magában. Ez viszont azt jelenti, hogy php alatt asystem()
engedélyezése nem jár a környezet módosításával.Egy php-ban megírt script is fixálja a környezetet, mert php kell hozzá. Ha arra célzol a fixálással, hogy a php script az adott
system()
hívással a Unix shellhez van kötve, arra írtam, hogy ezzel nincs addig gond, amíg át nem térnek Windowsra.Ha jól értem, te azt javaslod, hogy ha php-t használ András, akkor a php beépített és engedélyezett függvényeivel oldja meg a feladatot (az adott szerveren
system()
nélkül), és lehetőleg mindent paraméterezve?Bocs, de azt hiszem több
Kérlek, továbbra is, hogy figyelmesen olvasd el amit írok. Nem javaslok semmit. Nem mondom, hogy jó, vagy nem jó. Azt írtam csak, hogy ez szerintem gányolás, vagyis hosszabb távon nem fenntartható.
btw, Te miért feltételezed, hogy a PHP és a Perl ugyan abban a környezetben fut? Nem te kardoskodtál amellet, hogy semmit se lehet feltételezni? Hol írja le bárki is, vagy csak akár utalást tesz rá, hogy ugyan az a környezet?
btw, a system() nem csak Unix/windows kérdés, amire megpróbálod leegyszerűsíteni, hogy elbagatelizálhasd a kérdést, hisz unixon se mindig van sort, főleg, ha egy chroot-ban, vagy egy docker konténerben fut a PHP, a fájl jogosultság problémákról már nem is beszélve.
pp
Látom, nagyon
system()
hívás, de nincs. Sem András nem tett erre megjegyzést, sem pedig a kód jellegéből nem lehet kitalálni.Egy átlagos fórumos kérdező, aki bemásolja a teljes php scriptet, ami tele van
mysql_query()
-vel és társaival, ott teljesen jogos feltételezni, hogy nem valami belső feldolgozásra kell a script, hanem website-ot szolgál ki, ott nyugodtan lehet adni olyan tanácsot, hogy írja át első körbenmysqli_()
-re, aztán meg használjon ellenőrzéseket,pdo
stb., de itt nincs erről szó. Nem lehet egyértelműen eldönteni és kijelenteni, hogy ez gányolás-e vagy sem.Ha tudom, hogy a scriptet sokáig fogják használni és
- bővíteni kell belátható időn belül vagy
- új szerverre/környezetbe fog kerülni,
akkor igazad van, és valóban gányolás lehet. Ellenkező esetben kár bármiféle általánosítással foglalkozni, mert csak időpocséklás.
Részemről a témát lezártam.