php cli: использование argv и getopt не работает

Попытка использовать переменную argv и getopt() не работает. Кто-нибудь знает обходной путь, кроме использования всех - или - опций:

<?php
$arr[] = "test:";
$options = getopt(NULL, $arr);
echo $options["test"];
?>

Простой пример выше, когда я запускаю:

php test.php --test=Привет, мир

Привет, мир

php test.php argv --test=Привет, мир

Нет вывода, потому что я поместил значение без - или -- перед ним.


person Devon    schedule 11.04.2013    source источник
comment
php.net/getopt - Синтаксический анализ параметров завершится при обнаружении первого не-параметра. последующее отбрасывается.   -  person M8R-1jmw5r    schedule 12.04.2013
comment
Да, теперь я замечаю, что он говорит: анализ параметров заканчивается при обнаружении первого не-параметра, все последующие отбрасываются. Кажется довольно неудобным. Все еще жду обходного пути.   -  person Devon    schedule 12.04.2013
comment
Да выглядит немного недальновидно. Тем более, что вход в функцию можно не предоставлять.   -  person M8R-1jmw5r    schedule 12.04.2013
comment
Попробуйте использовать $_SERVER['argv']   -  person sectus    schedule 12.04.2013
comment
Если ваш первый параметр всегда будет командой, вы можете удалить его из массива $argv после его обработки. Например: $command = $argv[1]; array_shift($argv);   -  person Derrick Miller    schedule 15.03.2017


Ответы (2)


Это немного грубая сила, но она лучше решает мою связанную проблему. На основе ответа пользователя 3307546:

function get_opts() {
    $opts = array();
    foreach($_SERVER["argv"] as $k => $a){
        if(preg_match( '@\-\-(.+)=(.+)@'  , $a, $m))
            $opts[$m[1]] = $m[2];
        elseif(preg_match( '@\-\-(.+)@'   , $a, $m))
            $opts[$m[1]] = true;
        elseif(preg_match( '@\-(.+)=(.+)@', $a, $m))
            $opts[$m[1]] = $m[2];
        elseif(preg_match( '@\-(.+)@'     , $a, $m))
            $opts[$m[1]] = true;
        else
            $opts[$k] = $a;
    }
    return $opts;
}

So

> php cli/index.php gen/cache/reports -e --refresh-api -s="2020-04-16" -v

Анализируется как

{
    0: "cli/index.php",
    1: "ttd/cache/reports",
    "e": true,
    "refresh-api": true,
    "s": "2020-04-16",
    "v": true
}

Все «не-параметры» отображаются с их порядковым номером в решётке.

person elmartin1989    schedule 16.04.2020

person    schedule
comment
Даже если ваш ответ может быть правильным, добавление небольшого объяснения никому не повредит и побудит других пользователей проголосовать за ваши ответы. - person nKn; 13.02.2014
comment
Ваш код работает для моего примера, я дам вам это, но он не работает для реального использования. Я сделал свою собственную работу, я опубликую ее, когда у меня будет шанс. - person Devon; 14.02.2014