Avatar billede nams Nybegynder
03. oktober 2003 - 21:55 Der er 18 kommentarer og
1 løsning

skal have delt noget data op i tabeller

Jeg har noget data som er kommet ved en søgning på disken
Dataen er en liste over filer som jeg gerne vil have delt op og smidt i DB

se eventuelt http://www.eksperten.dk/spm/409389

jeg står med en data som fek.s denne.

/var/www/siden/uploadet/brugere/hansen/fil1
/var/www/siden/uploadet/brugere/hansen/fil2
/var/www/siden/uploadet/brugere/hansen/fil3
/var/www/siden/uploadet/brugere/hansen/fil4
/var/www/siden/uploadet/brugere/hansen/fil5
/var/www/siden/uploadet/brugere/jensen/fil1
/var/www/siden/uploadet/brugere/jensen/fil2
/var/www/siden/uploadet/brugere/jensen/fil3
/var/www/siden/uploadet/brugere/jensen/fil4

Den har jeg nu fået splitte op i enkelte linier med
$soeg=shell_exec($shell);

$soegArr = explode("\n", $soeg);
$antalPoster = count($soegArr);

Disse bliver så smidt i DB

Så har jeg en anden DB hvor i jeg gerne vil have sorteret min data, så fek.s splitter hansen fra og tæller antal filer han har liggende og så det samme med næste bruger.

Jeg kan ud fra scriptet ikke fastlægge hvilke brugere der er, kun ud fra den data som jeg får efter søgningen.

Så groft sagt.
hvordan kommer jeg frem i linien til mellem nummer 6 og 7 "/" slash, læser navnet, finder resten der hedder det samme, lægger antallet sammen smidder det i DB, går videre til næste og gør det samme ????

Det er mig lidt svært at forklare men spørg endelig hvis der er noget i ikke forstår....
Avatar billede nielle Nybegynder
04. oktober 2003 - 08:48 #1
Ved du på forhånd hvad dine brugere hedder? Altså at de hedder "hansen" og "jensen" og at der ikke er andre? Dette er simpelt. Eller skal systemet selv kunne finde ud af når der kommer nye brugere? Dette er ikke simpelt.
Avatar billede nams Nybegynder
04. oktober 2003 - 10:42 #2
Hejsa
Nej jeg ved ikke hvad brugerne hedder, det er derfor jeg skal kunne finde frem til navnet mellem 6 og 7 "/" slash
for det er navnet på den mappe som også er brugernavnet.
Avatar billede nicklasb Nybegynder
04. oktober 2003 - 12:56 #3
ved ikke om jeg overhovedet har forstået det rigtigt.. For du har vist glemt at beskrive en del, for at det kan lade sig gøre..

Men får du dine resultater i et array?!?

For så kan du vel bare gøre noget ligende:

<?php
$var    = array();
$newvar = array();

$var[]  = '/var/www/siden/uploadet/brugere/hansen/fil1';
$var[]  = '/var/www/siden/uploadet/brugere/hansen/fil2';
$var[]  = '/var/www/siden/uploadet/brugere/hansen/fil3';
$var[]  = '/var/www/siden/uploadet/brugere/hansen/fil4';
$var[]  = '/var/www/siden/uploadet/brugere/hansen/fil5';
$var[]  = '/var/www/siden/uploadet/brugere/jensen/fil1';
$var[]  = '/var/www/siden/uploadet/brugere/jensen/fil2';
$var[]  = '/var/www/siden/uploadet/brugere/jensen/fil3';
$var[]  = '/var/www/siden/uploadet/brugere/jensen/fil4';


foreach ($var as $value) {
    $tempvar  = explode('/',$value);
    $newvar[] = $tempvar[6];
}

print_r(array_count_values($newvar));


?>

Den tager i en foreach-løkke og køre alle dine data i var igennem, og deler nu disse op ved alle /'erne.. Hernest tager den nu dataene fra den 6 plads (nulte plads medregnet), som i dette tilfælde vil være brugerens navn. Altså først en uden noget (den før den første /. Hernest den med dataene "var", hernest "www" osv, og på den 6 plads navnet. Dette stykke data ligger den nu ned i variablen newvar.
Til sidt printer jeg nu en count på antallet af unikke data, med værdien for hvor mange gange den har optrådt!
Altså kommer den i dette tilfælde til at være hansen = 5 jensen = 4.
Så er det vel bare at smække det i en database?
Avatar billede nams Nybegynder
04. oktober 2003 - 22:40 #4
på det link jeg skrev øverst er der lidt om hvad der foregik, men jeg vil lige prøve igen.

Jeg har taget ud fra dit eksempel, men jeg kan stadig ikke få de til at fungere.
jeg har dette lige nu


$shell="find /web/www/brugere/ -name *.doc";

$soeg=shell_exec($shell);
$soegArr = explode("\n", $soeg);
$antal = count($soegArr);

foreach ($soegArr as $value) {
$tempvar = explode('/',$value);
$bruger[] = $tempvar[4];
$antalfiler = array_count_values($bruger);
for($i = 0; $i <5; $i=$i+1)
{
echo "$antalfiler, $bruger[$i]<br>";
}
}

i min for løkke vil jeg så have erstattet det 5 tal med en form for automatisk nummer på antal linier der er men kun en bruger i hver og hvor antallet af filer denne bruger har.

Jeg forsøger at få 2 stk array's frem. et med mappe navnet og et array hvor antallet af filer står i som jo skal beregnet på hvor mange linier resultatet gav for hver mappe navn.

hmm det er pisse svært at forklare men håber det hjalp lidt ?
Avatar billede nams Nybegynder
04. oktober 2003 - 23:04 #5
en anden og måske bedre måde at forklare det på

linien $bruger[] = $tempvar[4];
giver et resultat hvor i brugermappens navn gemmes i et array.

der er fek.s 5 med hansen og 4 med jensen.
så vil jeg have alle hansen lagt sammen så den kun udskrives i en for løkke en gang og så lige regne sammen hvor mange linier der nu i alt var som et andet tal jeg så kan smide i DB sammen med navnet.
Det samme skal også gøres med de andre navne.

der hvor jeg skriver
echo "$antalfiler, $bruger[$i]<br>";
det er der min Mysql vil komme senere, men skal lige have det til at virke først.
Avatar billede nicklasb Nybegynder
05. oktober 2003 - 01:47 #6
har du prøvet ud fra det output der kommer fra din egen funktion at regne det ud, på den måde jeg postede et script til? Jeg forstår altså stadig ikke helt hvordan det er du vil have den til at gøre.. Men det er nok fordi det er lidt sent.. kan være jeg fatter det lidt bedre i morgen.. :D
Avatar billede nams Nybegynder
05. oktober 2003 - 11:23 #7
hvis jeg laver en copy af det du har lavet får jeg følgende output
Array ( [hansen] => 5 [jensen] => 4 )

problemet er bare at jeg ikke ved hvad jeg så skal stille op med denne data
altås den skal jo splittes ad og smides i DB

Jeg har selv prøvet lidt som vist.

problemet er bare at den hele tiden vil smide alle linier i DB.
Altså jeg har de samme navne i DB mange gange, men med hver deres sti naturligvis

Det jeg vil have er at navnet kun står der en gang og så skal der stå hvor mange filer dette navn har liggende...
Avatar billede nicklasb Nybegynder
05. oktober 2003 - 11:35 #8
nu har jeg prøvet at nærlæse hvad du skriver. Og har lige et par spørgsmål.. Det står mig stadig ikke helt klart hvad det er du vil.. Måske også derfor igen andre har prøvet at svare?
Nå.. here you go:

<snip>
i min for løkke vil jeg så have erstattet det 5 tal med en form for automatisk nummer på antal linier der er men kun en bruger i hver og hvor antallet af filer denne bruger har.
</snip>

Hvorfra får du de fem. Eller på en anden måde; Hvorfra vil du udlede det tal når du ikke har kørt dem alle igennem endnu? Kan være det er rigtigt det du laver, men så forstår jeg pludselig MEGET mindre end jeg troede..

<snip>
Jeg forsøger at få 2 stk array's frem. et med mappe navnet og et array hvor antallet af filer står i som jo skal beregnet på hvor mange linier resultatet gav for hver mappe navn.
</snip>

Har du prøvet den kode jeg skrev.. Tror stærkt på at der kommer et array ud af det :D

Nu har jeg ikke lige giddet sidde og teste dit script for at analysere hver enkelt lille del, og hvad der sker de pågældende steder.. Men kan gætte mig lidt til at

$shell="find /var/www/siden/uploadet/brugere/";
$soeg=shell_exec($shell);

's eneste opgave er at lave en tekststreng noget lignende:

$soeg = '/var/www/siden/uploadet/brugere/hansen/fil1
/var/www/siden/uploadet/brugere/hansen/fil2
/var/www/siden/uploadet/brugere/hansen/fil3
/var/www/siden/uploadet/brugere/hansen/fil4
/var/www/siden/uploadet/brugere/hansen/fil5
/var/www/siden/uploadet/brugere/jensen/fil1
/var/www/siden/uploadet/brugere/jensen/fil2
/var/www/siden/uploadet/brugere/jensen/fil3
/var/www/siden/uploadet/brugere/jensen/fil4';

Kan det passe??

Så bruger du selv efterfølgende:
$soegArr = explode("\n", $soeg);
$antalPoster = count($soegArr);

til at dele teksten op i mindre stykker.. Du får du et array med hver linie som ny værdi. Right?!?

Du kan nu udskrive de variabler du har dannet med
print_r($soegArr);
echo $antalPoster;

og evt. skrive dem ind i en database eller lignende..

Der vil i ovenstående eksempel komme til at stå et array med alle dine data (hver linie delt ud), samt en count på alle dataene, som i dit tilfælde giver 9.

Har du nu prøvet at sætte mit script under?
Altså så der kommer til at stå noget lignende:

<?php
// Alle dine linier skal her komme ud i en tekstvariabel $soeg.

$soegArr = explode("\n", $soeg);    // Her bliver din variabel delt op efter hver linie, og bliver gemt i array-variablen $soegArr
$antalPoster = count($soegArr);    // Her tæller du antalet af alle posterne. Måske rimligt urelevant?!? Men den bliver i hvert falde gemt i variablen $antalPoster

// Du har nu variablen $soegArr, som indeholder hver linie i en ny undervariabel.. Denne kan du printe til skærmen ved at skrive print_r($soegArr);
// Og antallet af poster kan udskrives med en simpel echo, noget lignende: echo "\n\n" . $antalPoster . "\n\n";

foreach ($soegArr as $value) {    // Her kører du hver værdi af array-variablen igennem og gemmer undervejs indholdet i variabelen $value
    $tempvar  = explode('/',$value);    // Her deler du den nye variabel $value op i dele, ud fra dine skråstreger, og ligger resultatet i $tempvar.
    $newvar[] = $tempvar[6];    // Her tager du det sjete led, og gemmer denne i en ny variabel kaldet $newvar.
}

?>

Du vil nu have to arrays. Det ene hedder $soegArr. Der står alle dine linier i. Og dit andet array hedder $newvar. Der står alle navnene i. Hvert navn har nu som værdi antallet af indentiske linier (ind til filnavnet.)

Prøv at gemme og køre ovenstående kode, og se om du ikke får det ønskede resultat..
Avatar billede nams Nybegynder
05. oktober 2003 - 11:47 #9
hmm det giver egentlig det samme resultat som sidste gang.

nu prøver jeg at forklare det lige ud af posen.

efter at lave en søgning på disken efter bestemte filer kan jeg fek.s få et resultal som
/var/www/siden/uploadet/brugere/hansen/fil1
/var/www/siden/uploadet/brugere/hansen/fil2
/var/www/siden/uploadet/brugere/hansen/fil3
/var/www/siden/uploadet/brugere/hansen/fil4
/var/www/siden/uploadet/brugere/hansen/fil5
/var/www/siden/uploadet/brugere/jensen/fil1
/var/www/siden/uploadet/brugere/jensen/fil2
/var/www/siden/uploadet/brugere/jensen/fil3
/var/www/siden/uploadet/brugere/jensen/fil4

ud fra det resultat kommer der 2 brugere frem, men forskelligt antal filer.
Jeg vil nu smide de 2 brugernavne i en DB og regne sammen hvor mange filer der er.
Til det skal jeg bruge en tabel alla

id | bruger | antal_filer

en anden søgning kunne måske give et resultat som fek.s

/var/www/siden/uploadet/brugere/hansen/fil1
/var/www/siden/uploadet/brugere/hansen/fil2
/var/www/siden/uploadet/brugere/hansen/fil3
/var/www/siden/uploadet/brugere/hansen/fil4
/var/www/siden/uploadet/brugere/hansen/fil5
/var/www/siden/uploadet/brugere/jensen/fil1
/var/www/siden/uploadet/brugere/jensen/fil2
/var/www/siden/uploadet/brugere/jensen/fil3
/var/www/siden/uploadet/brugere/jensen/fil4
/var/www/siden/uploadet/brugere/kbud/fil1
/var/www/siden/uploadet/brugere/knud/fil2
/var/www/siden/uploadet/brugere/knud/fil3
/var/www/siden/uploadet/brugere/knud/fil4

Så er der pludselig 3 brugere og så skal den naturligvis smide disse 3 brugere i DB og tælle hvor mange filer disse brugere har.

Var det bedre ?
Avatar billede nicklasb Nybegynder
05. oktober 2003 - 12:03 #10
nåå.. SÅ tror jeg, jeg fattede.. Tror bare problemet er at vi egentligt ikke rigtig ved mere end hvad du fortæller os. Så du tager en masse ting for givet, uden at forklare det lidt mere dybdegående ;D

En måske lidt omvej.. Men bare for at bygge videre på det vi allerede har fået bygget op (så DET i hvert falde ikke er spildt), kunne være noget ligende:

<?

// Søgning her!

$soegArr = explode("\n", $soeg);
$antalPoster = count($soegArr);

foreach ($soegArr as $value) {
    $tempvar  = explode('/',$value);
    $newvar[] = $tempvar[6];
}

$unique_vars  = array_unique($newvar);
$array_counts = array_count_values($newvar);

foreach ($unique_vars as $key => $temp_name) {
    echo 'Navn: ' . $temp_name . ' Antal filer: ' . $array_counts[$temp_name] .  "<br>\n";
}

?>

Der tager jeg i linien startende med "$unique_vars  = " og ligger alle de unikke navne ned i variablen $unique_vars. Herefter tager jeg i næste linie og tælle alle filerne for hver bruger. Disse resultater bliver nu lagt i variabler, med benævnelsen som navn, og antallet som værdi. (Den samme som vi brugte før).

Nu kommer der så endne en foreach løkke.. Her tager jeg og ligger indholdet af variablen $unique_vars (den med de unikke navne), ned i variablen $temp_name, og kalder navnet for de unikke navne det samme som $key, så jeg senere kan referere på dette inde i løkken.
Nu kan du i foreack-løkken rulle alle dine data igennem. Du har variablerne;
$temp_name som indeholder navnet på de forskellige brugere og
$array_counts[$temp_name] som indeholder antallet af filer..

Se om det er ikke er sådan du mener.. :D
Avatar billede nicklasb Nybegynder
05. oktober 2003 - 12:06 #11
en søgning på det sidste eksempel du gav med flere brugere vil igennem denne gang php-kode give følgende resultat..

Navn: hansen Antal filer: 5
Navn: jensen Antal filer: 4
Navn: kbud Antal filer: 1
Navn: knud Antal filer: 3

Sådan du mener ikk??
Avatar billede nams Nybegynder
05. oktober 2003 - 12:13 #12
Jamen halløjsa nu sker der noget :-)

ej der er 2 problemer tilbage.

1. den skriver en ekstre linie ud uden nogen data, altså den skriver en ekstre til sidst selvom den ikke har data til den.

2. linien "$array_counts = array_count_values($newvar);"
giver følgende fejl ?
Warning: array_count_values() [function.array-count-values]: Can only count STRING and INTEGER values!

ellers ser det ud som om det virker som jeg gerne vil have det til
Avatar billede nams Nybegynder
05. oktober 2003 - 12:14 #13
Jeg undskylder men jeg er totalt idiot til de arrays og som jeg også skrev i starten, jeg anede ikke hvordan jeg skulle formulere problemet.
Avatar billede nicklasb Nybegynder
05. oktober 2003 - 12:29 #14
nu fatter jeg altså ikke lige en meter af hvad jeg sidder og koder. Så kan kun lave det ud fra det du skriver her..
Men er det fordi at din $soeg kommer til at blive noget lignende

$soeg = '/var/www/siden/uploadet/brugere/hansen/fil1
/var/www/siden/uploadet/brugere/hansen/fil2
/var/www/siden/uploadet/brugere/hansen/fil3
/var/www/siden/uploadet/brugere/hansen/fil4
/var/www/siden/uploadet/brugere/hansen/fil5
/var/www/siden/uploadet/brugere/jensen/fil1
/var/www/siden/uploadet/brugere/jensen/fil2
/var/www/siden/uploadet/brugere/jensen/fil3
/var/www/siden/uploadet/brugere/jensen/fil4
/var/www/siden/uploadet/brugere/kbud/fil1
/var/www/siden/uploadet/brugere/knud/fil2
/var/www/siden/uploadet/brugere/knud/fil3
/var/www/siden/uploadet/brugere/knud/fil4
';

i stedet for
$soeg = '/var/www/siden/uploadet/brugere/hansen/fil1
/var/www/siden/uploadet/brugere/hansen/fil2
...
/var/www/siden/uploadet/brugere/knud/fil4';

Og kan forstå det er et konstant problem.. Altså at den gør det hver gang?

For så er det vel bare at slette den sidste værdi i arrayet $soegArr som er den tomme linie?

Det kan du gøre ved at sætte unset($soegArr[$antalPoster-1]); ind under din optælling af totale variabler..

Eller hvis du skal bruge optællingen senere kunne det måske være en ide allerede at trække den fra før du går vidre med den lidt abstrakte variabel..

Altså så koden efter din dannelse af variablen $soeg kommer til at ligne noget lignende:

$soegArr = explode("\n", $soeg);
$antalPoster = count($soegArr) - 1;
unset($soegArr[$antalPoster]);

... osv. som resten af koden hele tiden har set ud.. :D

Prøv det.. :D
Avatar billede nams Nybegynder
05. oktober 2003 - 12:41 #15
okey jeg smider lige hele koden som den ser ud nu...

<?php

$shell="find /var/www/domain.dk/ -name *.doc";
$soeg=shell_exec($shell);


// Søgning her!

$soegArr = explode("\n", $soeg);
$antalPoster = count($soegArr);

foreach ($soegArr as $value) {
    $tempvar  = explode('/',$value);
    $newvar[] = $tempvar[4];
}

$unique_vars  = array_unique($newvar);
$array_counts = array_count_values($newvar);

foreach ($unique_vars as $key => $temp_name) {
    echo 'Navn: ' . $temp_name . ' Antal filer: ' . $array_counts[$temp_name] .  "<br>\n";
}

?>

ved at køre dette script får jeg følgende output.

Warning: array_count_values() [function.array-count-values]: Can only count STRING and INTEGER values! in /var/www/domain.dk/testing.php on line 18
Navn: prog Antal filer: 2
Navn: test01 Antal filer: 2
Navn: test02 Antal filer: 4
Navn: Antal filer:

dette er ren copy både fra koden og fra siden.

på siden skulle der gerne kun komme
Navn: prog Antal filer: 2
Navn: test01 Antal filer: 2
Navn: test02 Antal filer: 4
frem...
Avatar billede nicklasb Nybegynder
05. oktober 2003 - 12:52 #16
I den kode du lige har skrevet har du jo heller ikke slettet den sidste værdi i arrayet soegArr.. Prøv at skifte koden

$soegArr = explode("\n", $soeg);
$antalPoster = count($soegArr);

ud med

$soegArr = explode("\n", $soeg);
$antalPoster = count($soegArr) - 1;
unset($soegArr[$antalPoster]);

Hvis ikke det virker, bliver du nok lige nød til at skrive $soeg ud på skærmen med echo $soeg; og paste det her ind..
Avatar billede nams Nybegynder
05. oktober 2003 - 13:00 #17
Nøj hvor er det godt..
Jeg tror virkelig jeg er kørt død i denne kode, men nu virker det som jeg gerne skulle have det til, så nu er det kun at få det hele omskrevet så det passer ind og gør det jeg gerne skulle have den til...

Jeg siger tak for kampen. Smidder du lige et svar ? så kan vi få lukket spm ??
Avatar billede nicklasb Nybegynder
05. oktober 2003 - 13:07 #18
Det vigtigste er vel at du fatter hvad der sker.. Hvilken del er det du ikke forstår?? Så må jeg jo prøve at beskrive hvad der sker det pågældende sted.. :D

Men svar her!
Avatar billede nams Nybegynder
05. oktober 2003 - 13:11 #19
Mit generelle problem er de skide arrays som jeg ikke rigtig spiller sammen med, jeg ved ikke hvorfor, men de giver åbenbart ikke mening oven i mit lille hoved.

Når jeg står med problemer som disse plejer jeg at slå alle de funktioner op i php manualen som bliver brugt og læse mere om dem for at kunne fatte hvad min kode egentlig gør og det vil jeg også gøre her, så jeg skal nok finde svaret :-)
Men igen tak for kampen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester