Arrays duplicates verwijderen case sensitive
Ik geef mijn leden de mogelijkheid om een persoonlijke youtube top 20 samen te stellen.
Daarvoor moet ik uit de samengestelde lijsten eerst de duplicate items te verwijderen.
Het lukt wel, maar als de lege plekken verwijderen, dan wordt niet meer gekeken naar de case sensitive.
Dat komt door het toepassen van array_splice.
Iemand een mogelijkheid om een bruikbare array te produceren, die ik weer verder kan gebruiken?
Dit was een testje:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
$arr0 = array("TIjE6RIAv2s","Q4xyiJkX4vw","_5BzyInFf5M","q4xyiJkX4vw","91EbIgyFA1Y");
$arr1 = array("tIjE6RIAv2s","Q4xyiJkX4vw","_5BzyInFf5M","vdufteeVZyo","CqkpWByCzL4");
$arr2 = array("Bn1rdYzv4qM","Q4xyiJkX4vw","_5BzyInFf5M","vdufteeVZyo","-dY3s415TP0");
$arr3 = array("Bn1rdYzv4qM","tIjE6RIAv2s","Q4xyiJkX4vw","vdufteeVZyo","s9bXNR9hdIk");
$arr= array_unique(array_merge($arr0,$arr1,$arr2, $arr3));
if ($arr[$i] =='')
{
array_splice($arr, $i, 1);
}
//$arr_length = count($arr);
$arr_length = 20;
for($i=0;$i<$arr_length;$i++)
{
echo $arr[$i].'<br>';
}
Zonder splice (11 stuks):
TIjE6RIAv2s
Q4xyiJkX4vw
_5BzyInFf5M
q4xyiJkX4vw
91EbIgyFA1Y
tIjE6RIAv2s
vdufteeVZyo
CqkpWByCzL4
Bn1rdYzv4qM
-dY3s415TP0
s9bXNR9hdIk
Met splice (10 stuks):
Q4xyiJkX4vw
_5BzyInFf5M
q4xyiJkX4vw
91EbIgyFA1Y
tIjE6RIAv2s
vdufteeVZyo
CqkpWByCzL4
Bn1rdYzv4qM
-dY3s415TP0
s9bXNR9hdIk
$arr1 = array("tIjE6RIAv2s","Q4xyiJkX4vw","_5BzyInFf5M","vdufteeVZyo","CqkpWByCzL4");
$arr2 = array("Bn1rdYzv4qM","Q4xyiJkX4vw","_5BzyInFf5M","vdufteeVZyo","-dY3s415TP0");
$arr3 = array("Bn1rdYzv4qM","tIjE6RIAv2s","Q4xyiJkX4vw","vdufteeVZyo","s9bXNR9hdIk");
$arr= array_unique(array_merge($arr0,$arr1,$arr2, $arr3));
if ($arr[$i] =='')
{
array_splice($arr, $i, 1);
}
//$arr_length = count($arr);
$arr_length = 20;
for($i=0;$i<$arr_length;$i++)
{
echo $arr[$i].'<br>';
}
Zonder splice (11 stuks):
TIjE6RIAv2s
Q4xyiJkX4vw
_5BzyInFf5M
q4xyiJkX4vw
91EbIgyFA1Y
tIjE6RIAv2s
vdufteeVZyo
CqkpWByCzL4
Bn1rdYzv4qM
-dY3s415TP0
s9bXNR9hdIk
Met splice (10 stuks):
Q4xyiJkX4vw
_5BzyInFf5M
q4xyiJkX4vw
91EbIgyFA1Y
tIjE6RIAv2s
vdufteeVZyo
CqkpWByCzL4
Bn1rdYzv4qM
-dY3s415TP0
s9bXNR9hdIk
Gewijzigd op 25/09/2017 23:31:12 door Hans De Ridder
Waarom gebruik je niet gewoon unset ipv array_splice om lege plekken uit de array te verwijderen?
Ik heb unset geprobeerd, maar had dezelfde uitwerking als de lijst met de gaten.
Tenzij ik wat verkeerd heb gedaan natuurlijk.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$arr0 = array("TIjE6RIAv2s","Q4xyiJkX4vw","_5BzyInFf5M","q4xyiJkX4vw","91EbIgyFA1Y");
$arr1 = array("tIjE6RIAv2s","Q4xyiJkX4vw","_5BzyInFf5M","vdufteeVZyo","CqkpWByCzL4");
$arr2 = array("Bn1rdYzv4qM","Q4xyiJkX4vw","_5BzyInFf5M","vdufteeVZyo","-dY3s415TP0");
$arr3 = array("Bn1rdYzv4qM","tIjE6RIAv2s","Q4xyiJkX4vw","vdufteeVZyo","s9bXNR9hdIk");
$arr= array_unique(array_merge($arr0,$arr1,$arr2, $arr3));
foreach($arr as $k=>$v)
{
echo $k.' - '.$v.'<br>';
}
?>
$arr0 = array("TIjE6RIAv2s","Q4xyiJkX4vw","_5BzyInFf5M","q4xyiJkX4vw","91EbIgyFA1Y");
$arr1 = array("tIjE6RIAv2s","Q4xyiJkX4vw","_5BzyInFf5M","vdufteeVZyo","CqkpWByCzL4");
$arr2 = array("Bn1rdYzv4qM","Q4xyiJkX4vw","_5BzyInFf5M","vdufteeVZyo","-dY3s415TP0");
$arr3 = array("Bn1rdYzv4qM","tIjE6RIAv2s","Q4xyiJkX4vw","vdufteeVZyo","s9bXNR9hdIk");
$arr= array_unique(array_merge($arr0,$arr1,$arr2, $arr3));
foreach($arr as $k=>$v)
{
echo $k.' - '.$v.'<br>';
}
?>
0 - TIjE6RIAv2s
1 - Q4xyiJkX4vw
2 - _5BzyInFf5M
3 - q4xyiJkX4vw
4 - 91EbIgyFA1Y
5 - tIjE6RIAv2s
8 - vdufteeVZyo
9 - CqkpWByCzL4
10 - Bn1rdYzv4qM
14 - -dY3s415TP0
19 - s9bXNR9hdIk
Gewijzigd op 26/09/2017 00:41:40 door - SanThe -
Je kunt eventueel rond regel 12 dit toevoegen:
Ook zou ik gewoon array_filter() gebruiken om je lege elementen uit je array te verwijderen.
Gewijzigd op 26/09/2017 00:47:53 door Ben van Velzen
Wat ik zo machtig interessant vind, is regel 8 van je script. Je test daar $arr[$i], maar waar komt $i vandaan? Waarschijnlijk moet er nog een for-loopje omheen...
Gewijzigd op 26/09/2017 00:55:59 door Willem vp
Ik had het geplakt, maar verkeerd neergezet.
Het stond in de for loop.
Dat komt door de manier waarop array_splice werkt. Numerieke indices worden niet behouden. Sterker nog: wanneer je array_splice aanroept, hernummert hij de indices en dán pas gaat hij splicen. Dat verklaart dus waarom je een element kwijtraakt.
Maar nu we dit hebben ontdekt, kunnen we ook ge/misbruik maken van die eigenschap: als je array_splice aanroept en aangeeft dat je *niets* wilt verwijderen, krijg je een keurig nette array terug.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
print_r($arr);
array_splice($arr, 0, 0);
print_r($arr);
Voor:
Array
(
[0] => TIjE6RIAv2s
[1] => Q4xyiJkX4vw
[2] => _5BzyInFf5M
[3] => q4xyiJkX4vw
[4] => 91EbIgyFA1Y
[5] => tIjE6RIAv2s
[8] => vdufteeVZyo
[9] => CqkpWByCzL4
[10] => Bn1rdYzv4qM
[14] => -dY3s415TP0
[19] => s9bXNR9hdIk
)
Na:
Array
(
[0] => TIjE6RIAv2s
[1] => Q4xyiJkX4vw
[2] => _5BzyInFf5M
[3] => q4xyiJkX4vw
[4] => 91EbIgyFA1Y
[5] => tIjE6RIAv2s
[6] => vdufteeVZyo
[7] => CqkpWByCzL4
[8] => Bn1rdYzv4qM
[9] => -dY3s415TP0
[10] => s9bXNR9hdIk
)
array_splice($arr, 0, 0);
print_r($arr);
Voor:
Array
(
[0] => TIjE6RIAv2s
[1] => Q4xyiJkX4vw
[2] => _5BzyInFf5M
[3] => q4xyiJkX4vw
[4] => 91EbIgyFA1Y
[5] => tIjE6RIAv2s
[8] => vdufteeVZyo
[9] => CqkpWByCzL4
[10] => Bn1rdYzv4qM
[14] => -dY3s415TP0
[19] => s9bXNR9hdIk
)
Na:
Array
(
[0] => TIjE6RIAv2s
[1] => Q4xyiJkX4vw
[2] => _5BzyInFf5M
[3] => q4xyiJkX4vw
[4] => 91EbIgyFA1Y
[5] => tIjE6RIAv2s
[6] => vdufteeVZyo
[7] => CqkpWByCzL4
[8] => Bn1rdYzv4qM
[9] => -dY3s415TP0
[10] => s9bXNR9hdIk
)
Ik werk met data opslag via IPTC (opslag in image)
Het is een experimentele website.
Met nadruk op promotie voor personen die iets met de artiestenwereld te maken hebben.
Ik heb voor dit probleem de oplossing gevonden in een groeiende string.
Hierbij wordt de groeistring bekeken op nieuwe in toe te voegen items van een string.
Uitsluitend nieuwe items worden toegevoegd aan de groeistring.
In de images staan de youtubes als volgt opgeslagen op locatie 2#115.
Opmerkingen en verbeteringen blijven uiteraard welkom...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
TIjE6RIAv2s,Q4xyiJkX4vw,_5BzyInFf5M,q4xyiJkX4vw,91EbIgyFA1Y
tIjE6RIAv2s,Q4xyiJkX4vw,_5BzyInFf5M,vdufteeVZyo,CqkpWByCzL4
Bn1rdYzv4qM,Q4xyiJkX4vw,_5BzyInFf5M,vdufteeVZyo,-dY3s415TP0
Bn1rdYzv4qM,tIjE6RIAv2s,Q4xyiJkX4vw,vdufteeVZyo,s9bXNR9hdIk
$files = glob(realpath($_SERVER[ 'DOCUMENT_ROOT' ]) . "fotomap/*.{jpg}", GLOB_BRACE);
$dataT ='';
foreach($files as $file)
{
$r = output_iptc_data($file,'2#115');
if ($r !="")
{
$dataT = $dataT.','.$r;
$str = implode(',',array_unique(explode(',', $dataT)));
}
}
// verwijderen eerste komma
$str = substr($str, 1);
echo $str;
tIjE6RIAv2s,Q4xyiJkX4vw,_5BzyInFf5M,vdufteeVZyo,CqkpWByCzL4
Bn1rdYzv4qM,Q4xyiJkX4vw,_5BzyInFf5M,vdufteeVZyo,-dY3s415TP0
Bn1rdYzv4qM,tIjE6RIAv2s,Q4xyiJkX4vw,vdufteeVZyo,s9bXNR9hdIk
$files = glob(realpath($_SERVER[ 'DOCUMENT_ROOT' ]) . "fotomap/*.{jpg}", GLOB_BRACE);
$dataT ='';
foreach($files as $file)
{
$r = output_iptc_data($file,'2#115');
if ($r !="")
{
$dataT = $dataT.','.$r;
$str = implode(',',array_unique(explode(',', $dataT)));
}
}
// verwijderen eerste komma
$str = substr($str, 1);
echo $str;
Waarom splits je dit probleem niet op in deelproblemen?
Probleem #1: het (eenmalig) bijhouden van (unieke) video-id's.
Probleem #2: afspeellijsten van deze items in een specifieke volgorde (mogelijk gekoppeld aan personen).
En waarom ben je aan het modderen met arrays? Waarom sla je dit niet op in een database? Dan was je vrij snel tot een constructie gekomen waarbij je video's, gebruikers en afspeellijsten organiseert in (koppel)tabellen.
Het opslaan van data in afbeeldingen is een beetje vergezocht? Als je gestructureerd data wilt opslaan en je niet de beschikking hebt over een database lijken mij JSON of XML veel betere alternatieven? Maar niet een of andere zelf gebreide standaard :/.
Dus zoek ook niet altijd vanzelfsprekende oplossingen.
Ik heb de beschikking over een database. (Gedeelde server).
Maar heb wat geexperimenteerd met opslag van gegevens in images.
Dat voldoet prima.
Makkelijk op te slaan en elke output is eenvoudig op te roepen.
Met een paar regels PHP heb ik het nu zo,
dat de positie op de individuele lijst bepalend is voor het aantal toegekende punten.
Die worden dan bij elkaar opgeteld.
En dat bepaalt weer uiteindelijk hoe de site stemlijst eruit ziet.
Er zijn al heel wat blokken gemaakt.
Website onderdelen, registratie/inlog,/wijzigingen, googlemaps,
Maar soms wel leuk om als afleiding even een optie te proberen.
Er zit geen druk op.
Gewoon hobby. Over poosje wellicht online.
De verschillende blokken van de website zijn zo goed als klaar.
Maar soms als afleiding is het wel leuk wat mogelijke opties te bestuderen.
En vast stuk uit te werken.
Er zit geen druk op.
Is gewoon voor mezelf.
En als ik het zinnig vind dan komt het online.
Vandaar dat ik ook als thema heb 'promotie artiestenwereld'.
Dat doel geeft genoeg creativiteit.
Ik creeer geen nieuwe standaard.
IPTC is gewoon opgenomen in PHP.
Maar vooral bedoeld om fotogegevens op te slaan.
Ik gebruik het wat anders.
Gewijzigd op 26/09/2017 23:35:57 door Hans De Ridder
Er zullen momenten zijn (of komen) waarin je heroverweegt hoe je deze data gaat gebruiken.
Met de gekozen oplossing ben je nu al meteen je eigen informatie aan het repareren (wegfilteren van duplicaten), nog voordat je hier wat dan ook mee doet. Dit lijkt mij een indicatie dat dit anders en mogelijk beter kan. De data is niet direct "gebruiksklaar".
Nu zijn dit mogelijk nog persoonlijke top 20 afspeellijsten, maar misschien wil je op den duur wat statistieken introduceren (X gebruikers hebben video Y in hun afspeellijst staan), lijsten kunnen delen et cetera. Met de huidige opzet is dit een hels karwei, eerst moet je *alle* data uitpakken (en opschonen) voordat je uberhaupt kunt gaan meten en rekenen. Met de data valt niet (of in ieder geval niet makkelijk) te werken.
Andere programmeurs die je deze oplossing laat zien zullen waarschijnlijk hun wenkbrauwen fronsen, of het gemiddeld aantal wtf's per minuut doen laten stijgen. Bovenstaande code is ook niet voorzien van commentaarregels (geen annotatie). Meestal staat er in een verhaaltje kort uitgelegd wat alles doet en motiveert zijdelings ook WAAROM het op die manier gedaan is. Je zult dit op zijn minst naar jezelf toe moeten motiveren maar op dit moment is de code vanwege het ontbreken van commentaar niet erg leesbaar. Als iemand anders jouw werk om wat voor reden dan ook zou moeten inzien of zal moeten gebruiken heeft deze een dagtaak aan het reverse engineeren van wat er nu concreet gebeurt. Omgekeerd zou jij mogelijk ook ooit met code van anderen aan de slag moeten. Als er geen letter geannoteerd is is daar eigenlijk geen beginnen aan. Wat gij niet wilt dat u geschiedt... De code is niet transparant.
Even los van het feit dat IPTC bedoeld is voor het opslaan van metadata van afbeeldingen heeft deze waarschijnlijk limieten qua opslagruimte en/of de lengte van individuele velden. En mogelijk zul je ook character encoderingen in overweging moeten nemen. Deze dingen spelen nu mogelijk niet, maar wat als je iedereen een persoonlijke top 50 geeft en het dan niet past? Of dat je mogelijk exotische karakters gaat opslaan die vervolgens door de vleesmolen gaan. Mogelijk kom je dus in de knoei als je deze oplossing uitbouwt.
Bottom line is dat wat je gebruikt naar alle waarschijnlijkheid geen geschikt medium is voor wat je probeert te doen. Het is mede de verantwoordelijkheid van gebruikers van deze site ("vakgenoten") om je hier op te wijzen. Wat je hier vervolgens mee doet mag je zelf weten :).
Het zijn niet mijn lijsten, maar van leden.
Die kunnen ook afgespeeld worden op de website.
De website top 20 wordt samengesteld uit deze lijsten.
Voor mij is het straks van belang bij hoeveel leden
ik beter weer kan overgaan naar de database.
Dat is in principe niet zo'n probleem.
De opdrachten zijn niet zo verschillend tov database.
Een image is 1 x 1 pixel in jpg. Ongeveer 400b.
Met alle persoonlijke info wordt het ongeveer 1,5kb.
Elk lid heeft een eigen image.
Daar staat alle persoonlijke data opgeslagen.
Alle documenten in pdf worden images van gemaakt.
Meeste is tijdelijk.
Daarom worden die gegevens voor de layout in de image geplaatst.
Wordt de image verwijderd, dan is de data ook weg.
Mag/moet ook.
Youtube kent een eigen mogelijkheid om images te plaatsen.
Originelen worden pas bekeken/beluisterd als er geklikt wordt.
De images zelf hebben 31 posities om data te plaatsen.
Dat mag ook komma gescheiden zijn.
Ik ben nog geen problemen tegen gekomen bij data tot 2000 characters per regel.
Is voor mij helemaal nieuw.
En er is naast de eenvoudige oproep- en plaatsen script weinig gedocumenteerd bij PHP.
Er zijn wel classes gemaakt.
Het heeft zeker ook nadelen.
Bij een wijziging moet alle data van een image worden gevraagd.
De wijziging(en) doorvoeren, en alles weer terugplaatsen.
Het vraagt ook oplettendheid mbt veiligheid.
Maar ik vind het leuk om die grenzen allemaal op te zoeken.
Ook benieuwd hoe dit doorwerkt op verwerkings snelheden.
En op het dataverkeer.
Gewijzigd op 27/09/2017 22:55:17 door Hans De Ridder
> En op het dataverkeer.
Als de gegevens op de server worden verwerkt, zal het dataverkeer niet hoger of lager zijn dan wanneer je de gegevens in een database hebt.
De verwerkingssnelheid zal allicht lager zijn dan bij een database, maar wanneer het om een beperkt aantal bestanden gaat, zul je dat niet echt merken. Vanaf een paar honderd bestanden (zo te zien staat alles in 1 directory) worden de toegangstijden wel steeds langer en ik verwacht dat je vanaf een paar duizend bestanden serieus rekening moet gaan houden met timeouts. Afhankelijk van je hardware misschien al eerder.
Een ander punt om in het achterhoofd te houden is concurrency. Wanneer een plaatje wordt herschreven, is het even niet beschikbaar. Als precies op dat moment een andere worker het plaatje wil inlezen, kan het misgaan. Onder meer om die reden slaan we op mijn werk bepaalde plaatjes op in een database. Dat zou in jouw geval ook nog een oplossing kunnen zijn: dan heb je én de voordelen van een database én je gegevens in IPTC. ;-)
Het grootste deel van het herschrijven zijn wijzigingen in de persoonlijke gegevens.
Dus dat is prive. En niet beschikbaar voor andere leden.
Dat geldt in principe ook voor flyers (jpg) en documenten (pdf).
In principe laat ik van elke soort document er telkens maar 1 toe.
Die kan dan onder dezelfde naam vervangen worden of aangevuld.
Daar kan inderdaad het probleem optreden van wijzigen en bekijken tegelijk.
Maar uitsluitend de eigenaar van de image/document kan wijzigingen aanbrengen.
Zijn documenten als aangeboden, gevraagd, gestolen.
Zal in principe niet veel meer aan gewijzigd worden.
Wel goed om me er op te attenderen.
Dat zijn bovendien documenten en flyers,, die een beperkte levensduur hebben (2 weken?)
Ik maak me meer zorgen over het opslaan van de originele documenten.
Dat gaat wellicht bij meer leden een opslagprobleem geven.
Ik zoek naar opslag op een cloud, waar vanaf de website, of rechstreeks via
de leden, bestanden op gezet kunnen worden.
Ben nog niks zinnigs tegen gekomen. Ook niet met API.
Maar het is allemaal uit te breiden.
Dus eerst vrolijk verder borduren op idee....
Gewijzigd op 28/09/2017 01:27:41 door Hans De Ridder