Frage

Ich verwende Console_Getopt in PHP 5.2, und es überraschend zu finden, wie anders es von getopt in anderen Sprachen ist (Perl, Bash, Java). Kann jemand empfehlen, wie die args aus dem Array zu analysieren zurückgegeben „$ entscheidet sich“?

php myprog.php -a varA -c -b varB

$o= new Console_Getopt;
$opts = $o->getopt($argv, "a:b:c");
print_r($opts);

// die print_r wieder unter

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => a
                    [1] => varA
                )

            [1] => Array
                (
                    [0] => c
                    [1] =>
                )

            [2] => Array
                (
                    [0] => b
                    [1] => varB
                )

        )

    [1] => Array
        (
        )

)

Ich begann wie unten etwas zu tun, das langatmig ist, so ist mir die Suche nach Anregungen für den Umgang mit Kommandozeilen-Flags in PHP.

foreach($opts[0] as $i -> $keyval) {
    list($key, $val) = $keyval;
    if($key == 'a') {
        print "valueForA: $val\n";
    } else if($key == 'b') {
        print "valueForB: $val\n";         
    } else if($key == 'c') {
        print "c is set\n";
    }
}

Ich frage mich, warum getopt PHP nicht Perl ist wie, wo der Schlüssel des Arrays ist die Flagge zB $ opts { ‚a‘} .. das wäre bequemer.

War es hilfreich?

Lösung

Per Inline-Dokumentation

  

Der Rückgabewert ist ein Array aus zwei Elementen: Die Liste der geparsten   Optionen und die Liste der nicht-Option Befehlszeilenargumente. Jeder Eintrag in   die Liste der analysierten Optionen ist ein Paar von Elementen - die erste   die Option gibt, und die zweite gibt die Optionsargument,   wenn es ein.

Was bedeutet, dass Sie bequem die zweite Anordnung verwerfen, und ein Engagement für das das Array von Arrays, den ersten Elemente Option, zweiten Elementwert, Format zu halten nehmen.

Mit dieser Annahme vorhanden, versuche

$o= new Console_Getopt;
$opts = $o->getopt($argv, "a:b:c");
print_r(getHashOfOpts($opts));

function getHashOfOpts($opts) {
    $opts = $opts[0];
    $return_opts = $opts;
    $return_opts = Array();
    foreach($opts as $pair){
        $return_opts[$pair[0]] = $pair[1];
    }
    return $return_opts;
}

eine Datenstruktur mehr nach Ihrem Geschmack erhalten.

Was, warum dies ist anders als andere Implementierung von getopt, fragen Sie die Maintainer .

Andere Tipps

Überprüfen Sie GetOptionKit für PHP:

https://github.com/c9s/php-GetOptionKit

Überblick

use GetOptionKit\OptionCollection;
use GetOptionKit\OptionParser;

$options = new OptionCollection;
$options->add( 'f|foo:' , 'option require value' );  # returns spec object.

$options->add( 'b|bar+' , 'option with multiple value' );
$options->add( 'z|zoo?' , 'option with optional value' );

$options->add( 'f|foo:=i' , 'option require value, with integer type' );
$options->add( 'f|foo:=s' , 'option require value, with string type' );

$options->add( 'v|verbose' , 'verbose flag' );
$options->add( 'd|debug'   , 'debug flag' );


$parser = new OptionParser($options);
$result = $parser->parse( array( 'program' , '-f' , 'foo value' , '-v' , '-d' ) );

$spec = $result->verbose;
$spec = $result->debug;
$spec->value;  # get value

GetOptionKit \ OptionPrinter können Optionen für Sie drucken:

* Available options:
              -f, --foo   option requires a value.
              -b, --bar   option with multiple value.
              -z, --zoo   option with optional value.
          -v, --verbose   verbose message.
            -d, --debug   debug message.
                 --long   long option name only.
                     -s   short option name only.

Ich schrieb eine Wrapper-Klasse um getopt (), ähnlich wie Console_GetOpt aber ich denke, ein bisschen schöner.

Sie können es hier finden: http://github.com/pete-otaqui/ClipClop

Ein PHP-Option Parser basiert auf getopt ().

ClipClop ermöglicht Ihnen die einfache Kommandozeilen-Tools mit Optionen zu erstellen. ClipClop automatisch schön formatiert Gebrauchsanweisungen erzeugt und gibt auch eine bequeme API für Parameter und Werte zugreifen.

ClipClop Griffe erforderlich und optionale Parameter und Werte für sie. So eine gegebene Option wie „--verbose“ kann an sich erforderlich oder optional sein, und es kann keinen Parameterwert oder einen optionalen einen hat, oder einen erforderlichen ein.

ClipClop verwaltet mehrere Werte, obwohl einzelne Werte standardmäßig erzwingt, gegen reguläre Ausdrücke validieren können und bestimmte Typen für Sie parsen. Zahlen, Zahlen, json und Urls

Schnell Beispiel Erstellen Sie ein Skript namens „environment_test“, mit dem folgenden Code

#!/usr/bin/env php
<?php

// do this unless you have setup an Autoloader
require_once('/path/to/ClipClop.php');

$clipclop = new ClipClop();

$clipclop->addOption(array(
    'short' => 'e', // shortname, i.e. "-e"
    'long' => 'environment', // longname, i.e. "--environment"
    'value' => TRUE, // A value must be given such as "--environment=TEST"
    'help' => 'Set the environment', // help text for the 'usage' text
    'required' => TRUE, // Environment must be provided
));

// as soon as we ask for an option, ClipClop will parse CLI arguments with getopt()

$environment = $clipclop->getOption('e'); // returns the value set for 'e' OR 'environment'

print "You ran this script with environment: $environment";
?>

Es enthält verschiedene andere Optionen, und Unit-Tests.

Für das, was es wert ist, ich hacke vor kurzem ein kleines Projekt meiner eigenen für Kommandozeilen-Option in der PHP-Parser. Ich nenne es pharse (wie "PHP Parse" ... Art). Es ist zum Download auf GitHub hier:

https://github.com/chrisallenlane/Pharse

Es wurde so stark inspiriert von Trollop , dass Sie es ein Port fast in Erwägung ziehen könnte, obwohl ich nicht implementieren alle Merkmale Trollop hat. (Ich habe einige Funktionen nicht benötigen - wie Unterbefehle -. Für meine eigenen Zwecke, so dass ich nicht die Mühe)

Der allgemeine Kern der Bibliothek ist, dass seine Nutzung eine einzige Basisdatei beinhaltet erfordern, und dann ein einzelnes assoziatives Array von Optionen, um der pharse Klasse übergeben. Zum Beispiel:

    <?php

   # specify some options
   $options = array(
        'user_name'     => array(
            'description'   => 'Your username',
            'default'       => 'admin',
            'type'          => 'string',
            'required'      => true,
            'short'         => 'u',
        ),

        'password' => array(
            'description'   => 'Your password',
            'default'       => 'sexsecretlovegod',
            'type'          => 'string',
            'required'      => true,
        ),
    );

# You may specify a program banner thusly:
$banner = "This program logs you in to the Gibson.";
Pharse::setBanner($banner);

# After you've configured Pharse, run it like so:
$opts = Pharse::options($options);

?>

ich eine Blog-Post schrieb die Bibliothek Einführung hier:

http : //chris-allen-lane.com/2012/03/pharse-a-library-for-php-command-line-option-parsing/

gehackt ich die Bibliothek für den gelegentlichen Gebrauch für meine persönliche Projekte aus, also würde ich vorsichtig sein, bevor Sie dieses Skript in einer Produktionsumgebung bereitstellen. Ich habe nicht einmal dazu gekommen, noch richtige Unit-Tests zur Umsetzung, so ist gewarnt.

Mit dieser sagte, aber ich denke, es ist eine ziemlich nette kleine Skript ist, und ich denke, es ist für Hobby-Projekte perfekt geeignet ist und dergleichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top