arrays samenvoegen, ontdubbelen en sorteren

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

27/10/2016 13:57:57
Quote Anchor link
Ik heb een string waar ik een array van heb gemaakt, maar die blijkt uit meerdere arrays te bestaan die ik wil samenvoegen om te kunnen ontdubbelen en sorteren.

Dit is de gebruikte php:
$out = preg_split('/<.*?>/', $string);
print_r ($out);

Dit is nu het resultaat:
Array (
[0] => Harold
[1] => Pete
[2] => John
[3] =>
)
Array (
[0] => Charles
[1] => Joan
[2] => Kate
[3] => Pete
[4] =>
)
Array (
[0] => Tim
[1] => Alex
[2] => Kate
[3] =>
)

Dit is wat het moet worden:
Array (
[0] => Alex
[1] => Charles
[2] => Harold
[3] => Joan
[4] => John
[5] => Kate
[6] => Pete
[7] => Tim
[8] => John
)

Ik heb verschillende dingen geprobeerd, maar kom er niet uit.
 
PHP hulp

PHP hulp

24/12/2024 17:13:06
 
Pg Vincent

Pg Vincent

27/10/2016 14:22:46
Quote Anchor link
Arrays kun je gewoon bij elkaar optellen: http://php.net/manual/en/function.array-merge.php en daar staat ook dat je iets kunt doen als:

$a=array(...);
$b=array(...);
$totaal = $a+$b;

Voor het uniek maken heb je array_unique().

maar ik ben wel genieuwd naar waar je dit voor gebruikt, in de originele string staat blijkbaar iets als <aap><noot><mies> ofzo?
 

27/10/2016 15:07:48
Quote Anchor link
Ha Vincent,
Bovenstaande kan ik niet proberen omdat de string het resultaat van een query is en een paar honderd arrays oplevert. Die kan ik niet op bovenstaande manier verwerken. De query doorzoekt + 10.000 items waar in een gegeven veld de tekst 'body' voorkomt en als resultaat de tekst uit een ander veld retourneert.
Dit is dan de uitkomst: http://allaboutheaven.org/string
Die moet ik dan nog ontdubbelen, sorteren en automatisch van een link voorzien naar de betreffende pagina.
 
Pg Vincent

Pg Vincent

27/10/2016 15:32:32
Quote Anchor link
Een query? Dus de strings komen uit een database?

Je zoekt naar een woord in een kolom X en je krijgt een setje woorden terug uit kolom Y, en die wil je samenvoegen tot een lijst van unieke woorden?

Dan kun je de uitkomst van de query sowieso al aan elkaar plakken voordat je de split doet, dan heb je nog maar één string en dus ook één array.

Maar als het echt zo in je database staat dan zou ik dat sowieso als eerste veranderen door een aparte tabel te maken met de unieke woorden en een koppeltabel die elk van de 10.000 items koppelt aan alle woorden die ze bevatten. Dat zijn heel veel koppelingen, maar kan de database sneller mee over weg dan PHP de strings kan splitten.

EDIT: ik lees nu pas het stuk over de link, hoe wil je dat doen als je unieke woorden hebt en dus geen verwijzing naar alle pagina's meer *kunt* maken?
Gewijzigd op 27/10/2016 15:33:38 door Pg Vincent
 

27/10/2016 16:08:40
Quote Anchor link
We maken het iets ingewikkelder: de string komt uit een database query die met Smarty opgehaald wordt. Het zijn niet unieke woorden, maar unieke zinnen die corresponderen met titels van Activities waar ze naar moeten linken. Dat is op zich niet het probleem, probleem is de dubbele titels en het sorteren binnen arrays i.p.v. in de hoofdarray.
Hier zie je het resultaat zonder die ontdubbeling (er is nog een extra Jquery voor de alfabetisering): http://allaboutheaven.org/out-of-body-test

Hiervoor heb ik gebruikt:


{if count($items) > 20}
<div id="outlist-nav" style="margin-top:14px;"></div>
<ul id="outlist" class="observationslist" style="margin-top:16px;margin-left:-24px;">
{else}
<ul id="outlist" class="observationslist" style="margin-left:-28px;">
{/if}

{sort data=$items}
{foreach from=$sorted item=item}

{$item->type assign="type"}
{if (strpos($type,'body') !== false)}

{$item->activities assign="activities"}

{assign var="value" value=$activities}
{stringtoarray}
{foreach from=$myArray item=foo}

{if $foo !=''}

{assign var="existoverload" value="{cms_module module='Overload' filter_title_equal={$foo} summarytemplate='listrelated' detailpage='overload'}"}
{assign var="existsuppression" value="{cms_module module='Suppression' filter_title_equal={$foo} summarytemplate='listrelated' detailpage='suppression'}"}


<li><a href={$existoverload}{$existsuppression}>{$foo}</a></li>

{/if}
{/foreach}


{/if}

{/foreach}
</ul>
 
Pg Vincent

Pg Vincent

27/10/2016 16:21:06
Quote Anchor link
Dit moet je sowieso niet in smart doen natuurlijk, smarty is voor presentatie. Je haalt de data op in een script, je bewerkt het, en je geeft alleen de data die geprint moet worden door aan smarty en het enige wat smarty doet is het in nette HTML gieten. Dit is belangrijk want deze scheiding houdt je code beheerbaar.

Wat wil je precies doen als je zegt "probleem is de dubbele titels en het sorteren binnen arrays i.p.v. in de hoofdarray."?

Waarom krijg je dubbele titels, en wat zijn die "arrays" precies?
 

27/10/2016 16:28:58
Quote Anchor link
We maken het iets ingewikkelder: de string komt uit een database query die met Smarty opgehaald wordt. Het zijn niet unieke woorden, maar unieke zinnen die corresponderen met titels van Activities waar ze naar moeten linken. Dat is op zich niet het probleem, probleem is de dubbele titels en het sorteren binnen arrays i.p.v. in de hoofdarray.
Hier zie je het resultaat zonder die ontdubbeling (er is nog een extra Jquery voor de alfabetisering): http://allaboutheaven.org/out-of-body-test

Hiervoor heb ik gebruikt:


{if count($items) > 20}
<div id="outlist-nav" style="margin-top:14px;"></div>
<ul id="outlist" class="observationslist" style="margin-top:16px;margin-left:-24px;">
{else}
<ul id="outlist" class="observationslist" style="margin-left:-28px;">
{/if}

{sort data=$items}
{foreach from=$sorted item=item}

{$item->type assign="type"}
{if (strpos($type,'body') !== false)}

{$item->activities assign="activities"}

{assign var="value" value=$activities}
{stringtoarray}
{foreach from=$myArray item=foo}

{if $foo !=''}

{assign var="existoverload" value="{cms_module module='Overload' filter_title_equal={$foo} summarytemplate='listrelated' detailpage='overload'}"}
{assign var="existsuppression" value="{cms_module module='Suppression' filter_title_equal={$foo} summarytemplate='listrelated' detailpage='suppression'}"}


<li><a href={$existoverload}{$existsuppression}>{$foo}</a></li>

{/if}
{/foreach}


{/if}

{/foreach}
</ul>

Toevoeging op 27/10/2016 16:43:51:

Je hebt helemaal gelijk. Daarom heb ik de php bewerking in {stringtoarray} gezet. Als je naar http://allaboutheaven.org/out-of-body-test kijkt, zie je dat er nog wat moet gebeuren om de dubbele titels eruit te halen en alles te alfabetiseren. Ik krijg dubbele titels omdat het resultaat van de query opgedeeld wordt in strings die ik weliswaar uit elkaar haal (elke regel wordt met <br> gescheiden, daar breek ik de string op), maar omdat de titel in meerdere Observations voorkomt wordt die zo gedubbeld.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.