[PHP] Functie laten werken op generieke array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Binnen mijn cms'je lees ik de url uit die opgevraagd wordt (bijvoorbeeld site.com/fruit). Vervolgens loop ik door de $map array (die uit een database komt) en kijk of ik 'fruit' in die array kan vinden. Zo ja, dan retourneer ik het interne pad van die url (hier: story/view/3).

Nu kan het ook zijn dat iemand site.com/story/view/3 rechtstreeks intikt in zijn browser. In dat geval zoek ik mbv de $map2 array de verwijzende url op en redirect de gebruiker dan naar die url:
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
$map[fruit] = array('path' => 'story/view/3', 'nid' => 3);
$map[fruit/geel] = array('path' => 'store/add/2', 'nid' => 12);
$map[fruit/geel/citrus] = array('path' => 'mail/4', 'nid' => 1);

$map2[story/view/2] = array('url' => 'fruit', 'nid' => 3);
$map2[store/add/2] = array('url' => 'fruit/geel', 'nid' => 12);
$map2[mail/4] = array('url' => 'fruit/geel/citrus', 'nid' => 1);

// etc...

function redirect_visitor($input) {
  global $map, $map2;

  $url = $input;

  while ($url && !$map[$url])
    $url = substr($url, 0, strrpos($url, '/'));

  if ($map[$url]['path'])
    echo 'gevonden!';
  }
  else {
    $path = $input;

    while ($path && !$map2[$path])
      $path = substr($path, 0, strrpos($path, '/'));

    if ($map2[$path])
      refresh('header', $map2[$path]['url']);
    else
      return $input;
  }
}

redirect_visitor($_GET['q']); // in dit geval is $_GET['q'] 'fruit'

Ik vind het alleen helemaal niet netjes dat ik twee bijna identieke array's gebruik voor deze bewerkingen; al is het maar om de verloren extra resources om die tweede array samen te stellen. Het tweede deel van de redirect_visitor functie (regel 25 tot 29) wil ik graag herschrijven zodat deze ook van $map gebruik maakt. Ik zit er nu al een tijdje over na te denken, en denk dat ik voor het tweede deel met in_array zal moeten werken ( while ($path && !in_array($path, $map)), etc) maar heb twee vragen hierover:
  • is dat ueberhaupt mogelijk
  • Is er volgens jou veel tijdswinst te behalen door het herschrijven van het tweede deel met in_array en andere (relatief zware) array - zoekfuncties (die je m.i. nodig hebt hiervoor) boven het compilen van twee bijna identieke array's?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
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
<?php

$map['fruit'] = array('path' => 'story/view/3', 'nid' => 3, 'type' => 'normal');
$map['fruit/geel'] = array('path' => 'store/add/2', 'nid' => 12, 'type' => 'normal');
$map['fruit/geel/citrus'] = array('path' => 'mail/4', 'nid' => 1, 'type' => 'normal');
$map['story/view/2'] = array('url' => 'fruit', 'nid' => 3, 'type' => 'redirect');
$map['store/add/2'] = array('url' => 'fruit/geel', 'nid' => 12, 'type' => 'redirect');
$map['mail/4'] = array('url' => 'fruit/geel/citrus', 'nid' => 1, 'type' => 'redirect');

// etc...

function redirect_visitor($input, $map)
{
    $url = $input;
    
    while ($url && !$map[$url])
        $url = substr($url, 0, strrpos($url, '/'));
    
    if ( !isset($map[$url]) ) return $input;
    
    switch ( $map[$url]['type'] )
    {
        case "normal":
            
            echo 'gevonden!'; 
            
            break;
            
        case "redirect":
            
            refresh('header', $map[$path]['url']);
            
            break;
    }
} 

?>

Zoiets :?

Vraag 1: Alles is mogelijk (bijna ;))
Vraag 2: Nee, mischien een paar honderste van een seconde, omdat ik niet verwacht dat de array al te groot zal zijn.

[ Voor 27% gewijzigd door Michali op 12-03-2005 16:58 ]

Noushka's Magnificent Dream | Unity