getOpt_array

Door Subutux , 14 jaar geleden, 2.701x bekeken

Ik gebruik deze op mijn eigen website om de arguments te parsen die zijn meegegeven met de commando's die gebruikers ingeven. vermits php's eigen getopt niet werkt met gwne variablen dacht ik "ik schrijf het gewoon zelf!"

hier is mijn benadering tot een getopt functie die mogelijke arguments uit een variable plukt (gescheiden door een spatie(s)) en deze in een array met hun waarde zet.

bv:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?
include('getopt_array.php');

$agruments = "--test 22 -gogo=gadget -wonderwall foo-bar -yezz";
$opts = getopt_array($agruments);
echo "<pre>";
print_r($opts);
echo "</pre>";
?>

output:

Array
(
[--test] => 22
[-gogo] => gadget
[-wonderwall] => foo-bar
[-yezz] => 1
)

hopelijk is dit handig voor iemand ;)

Gesponsorde koppelingen

PHP script bestanden

  1. getoptarray

 

Er zijn 9 reacties op 'Getoptarray'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Steen
steen
14 jaar geleden
 
0 +1 -0 -1
Mooi script, nog nooit zoiets gezien iig.
Richard van Velzen
Richard van Velzen
14 jaar geleden
 
0 +1 -0 -1
Ik durf het bijna niet te zeggen, maarre: http://wiki.phpfreakz.nl/Regexes:_Veelgemaakte_fouten#De_.60..60
Toby hinloopen
toby hinloopen
14 jaar geleden
 
0 +1 -0 -1
@Richard:
In dit geval ben ik toch meer een voorstander van leesbaarheid ipv efficientie, zeker omdat het hier maar gaat om relatief kleine tekenreeksen.

Wel boeiend artikel voor wanneer ik weer eens wat met regex doe en efficientie wel van belang is.
Richard van Velzen
Richard van Velzen
14 jaar geleden
 
0 +1 -0 -1
Zoals daar duidelijk uitgelegd is het gebruik van . hier gewoon fout, bij de eerste dan. Daarnaast is dit dan ook nog veel mooier te doen met 1 enkele preg_match_all.
Subutux
subutux
14 jaar geleden
 
0 +1 -0 -1
mjah 't is mijn eerste "experiment" met regex dus ;)
Pim -
Pim -
14 jaar geleden
 
0 +1 -0 -1
Ik denk eigenlijk dat het gebruik van preg_split ipv str_replace en while ipv een foreach langzamer is dan gewoon if(empty($val)) continue;
Steen
steen
14 jaar geleden
 
0 +1 -0 -1
Hoe zou dit wél moeten dan? (met preg_match_all)
Richard van Velzen
Richard van Velzen
14 jaar geleden
 
0 +1 -0 -1
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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
function getOpt_array($optString) {
    $ret = array();
    
    foreach(
        preg_match_all('{
            -        # een minnetje
            -?        # nog een minnetje, maar deze is optioneel
            ( [a-zA-Z0-9_-]++ )        # een willekeurige prefix
            (?|
                \s* = \s* ( \S+ )
                |
                \s+ ( \S+ )
            )?        # het is in zijn geheel optioneel
        }x'
, $optString, $m, PREG_SET_ORDER) ?
            $m :
            array()
        as
$entry
    ) {
        $ret[$entry[1]] = isset($entry[2]) ?
            $entry[2] :
            true;
    }


    return $ret;
}


print_r(getOpt_array('--test 22 -gogo=gadget -wonderwall foo-bar -yezz'));[/code]

Zo bijvoorbeeld.

Edit: het zou trouwens heel fijn zijn als je je script test voordat je het plaatst!

[
code]<br />
<
b>Warning</b>:  reset() [<a href='function.reset'>function.reset</a>]: Passed variable is not an array or object in <b>/home/richard/www/socstore/test.php</b> on line <b>7</b><br />
<
br />
<
b>Notice</b>:  Undefined offset:  6 in <b>/home/richard/www/socstore/test.php</b> on line <b>15</b><br /> [/code]

Edit2: En dat is nogal een verschil... Over een miljoen iteraties:

Mijn tijd: 18.0842938423
Jouw tijd: 47.5069050789
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Steen
steen
14 jaar geleden
 
0 +1 -0 -1
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
<?php
function getOpt_array($optString) {
    $ret = array();
    $m = array();
    preg_match_all('{- -?( [a-zA-Z0-9_-]++ )(?|\s* = \s* ( \S+ ) | \s+ ( \S+ ))?}x', $optString, $m, PREG_SET_ORDER);
    foreach($m as $entry)
    {

        if(isset($entry[2]))
        {

            $ret[$entry[1]] = $entry[2];    
        }

        else
        {
            $ret[$entry[1]] = true;    
        }
    }


    return $ret;
}

?>


Deze is nog net iets sneller door het weghalen van een functie uit de foreachlus. Verder heb ik het ook niet zo op die verkorte if-lusjes.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. getoptarray

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

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.