Werken met array_search

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

George van Baasbank

George van Baasbank

03/02/2014 12:14:13
Quote Anchor link
Hallo allemaal;

In onderstaande routine wordt d.m.v. array_search gezocht naar gegevens die aan een bepaalde voorwaarde voldoen. Deze voor waarde is bijv dat een afspraak aanvangt om 10 uur.
Als er één afspraak is werkt dit goed. Bij meerdere afspraken wordt slechts de eerste afspraak getoond. De tweede komt niet in beeld.
Ik zal wel een while-lus moeten toepassen maar ik zie op dit moment even niet hoe ik dat kan/moet doen. Wie heeft voor mij een suggestie?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div class="ag_dagindeling_2" id="<?php echo $nVertIdnr ; ?>" draggable="true" ondragstart="drag(event)" ondrop="drop(event)" ondragover="allowDrop(event)">
   <?php
      $key
= array_search($cAanvangstijd,$aAanvang);
      if(substr($cAanvangstijd,0,2) == substr($aAanvang[$key],0,2)) {
         $nIdnr = "divid" . $nVert;
   ?>

   <a href="es-mutatie.php?id=<?php echo $aIdnr[$key] ; ?>">
      <div draggable="true" id="<?php echo $nIdnr ; ?>" ondragstart="drag(event)" ondrop="drop(event)" ondragover="allowDrop(event)">
      <div><?php echo substr($aAanvang[$key],0,5) . " - " . substr($aEinde[$key],0,5) ; ?></div>
      <div><?php echo $aAuditant[$key] ; ?> </div>
      </div>
   </a>
   <?php } ?>
</div>
<div class="clear"></div>
Gewijzigd op 03/02/2014 12:16:34 door George van Baasbank
 
PHP hulp

PHP hulp

24/11/2020 17:04:33
 
Michael -

Michael -

03/02/2014 12:22:00
Quote Anchor link
array_search geeft inderdaad maar 1 resultaat. Zie ook de documentatie. Vergelijkbare functie is array_keys()
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
$array = array("blue", "red", "green", "blue", "blue");
print_r(array_keys($array, "blue"));
/*
Array
(
    [0] => 0
    [1] => 3
    [2] => 4
)
*/


Dan wordt het zoiets
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<div class="ag_dagindeling_2" id="<?php echo $nVertIdnr ; ?>" draggable="true" ondragstart="drag(event)" ondrop="drop(event)" ondragover="allowDrop(event)">
<?php
    $keys
= array_keys($aAanvang,$cAanvangstijd);
    
    foreach($keys AS $key){
        if(substr($cAanvangstijd,0,2) == substr($aAanvang[$key],0,2)) {
            $nIdnr = "divid" . $nVert;
            ?>

            <a href="es-mutatie.php?id=<?php echo $aIdnr[$key] ; ?>">
            <div draggable="true" id="<?php echo $nIdnr ; ?>" ondragstart="drag(event)" ondrop="drop(event)" ondragover="allowDrop(event)">
            <div><?php echo substr($aAanvang[$key],0,5) . " - " . substr($aEinde[$key],0,5) ; ?></div>
            <div><?php echo $aAuditant[$key] ; ?> </div>
            </div>
            </a>
            <?php
        }
    }

?>

</div>
<div class="clear"></div>


edit: code toegevoegd
Gewijzigd op 04/02/2014 11:50:34 door Michael -
 
George van Baasbank

George van Baasbank

05/02/2014 11:39:59
Quote Anchor link
Michael,

Bedankt. Het werkt.

Topic gesloten
 
Willem vp

Willem vp

05/02/2014 13:02:43
Quote Anchor link
Michael - op 03/02/2014 12:22:00:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
    $keys
= array_keys($aAanvang,$cAanvangstijd);
    foreach($keys AS $key){
        if(substr($cAanvangstijd,0,2) == substr($aAanvang[$key],0,2)) {
?>

Aanvulling: dit is in PHP een zeer inefficiënte methode om een array af te lopen. Omdat PHP eigenlijk geen arrays kent maar dit onder water heeft geïmplementeerd als linked list, moet voor elke opgevraagde value de gehele linked list worden afgelopen (tot de betreffende key is gevonden). De verwerkingstijd neemt daardoor kwadratisch toe. Oftewel: als je array 10x zo groot wordt, duurt het 100x zo lang om alle elementen te verwerken.

Een efficiëntere manier is deze:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
   foreach ($aAanvang as $key => $value)
   {

      if(substr($cAanvangstijd,0,2) == substr($value,0,2)) {
?>

De verwerkingstijd zal hierdoor lineair groeien (dus: array 10x zo groot, dan verwerkingstijd ook 10x zo groot).

Bovendien loont het om als je een array-waarde vaker gebruikt, deze toe te kennen aan een aparte variabele. In het oorspronkelijke codefragment werd bijvoorbeeld 2x $aAanvang[$key] gebruikt, waardoor de verwerkingstijd nog eens 2x zo lang wordt. Als je aan het begin van de loop de array value eerst toekent aan een gewone variabele, hoeft de array slechts 1x te worden doorzocht.
 



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.