Php, console, параметры?

Есть вопрос. Как организовать красиво создание ассоциативного массива на основе передаваемых значений?


Как-то так — php script.php -filename someFileName -mime someMime -type someType.
  • Вопрос задан
  • 3949 просмотров
Решения вопроса 1
@Next_Alex
Я делал вот так:
Немного переработанный метод, найденный в сети:
function parseArgs( $_SERVER, $_REQUEST )
{
   $out = array();
   if ( is_array( $_SERVER ) && is_array( $_REQUEST ) )
   {
      $cli_args = isset( $_SERVER[ 'argv' ] ) ? $_SERVER[ 'argv' ] : array();
      if ( count( $cli_args ) > 1 )
      {
         array_shift( $cli_args );
         foreach ( $cli_args as $arg )
         {
            // --foo --bar=baz
            if ( substr( $arg, 0, 2 ) == '--' )
            {
               $eqPos                  = strpos( $arg, '=' );
               // --foo
               if ( $eqPos === false )
               {
                  $key                = substr( $arg, 2 );
                  $value              = isset( $out[ $key ] ) ? $out[ $key ] : true;
                  $out[ $key ]          = $value;
               }
               // --bar=baz
               else
               {
                  $key                = substr( $arg, 2, $eqPos - 2 );
                  $value              = substr( $arg, $eqPos + 1 );
                  $out[ $key ]          = $value;
               }
            }
            // -k=value -abc
            else if ( substr( $arg, 0, 1 ) == '-' )
            {
               // -k=value
               if ( substr( $arg, 2, 1 ) == '=' )
               {
                  $key                = substr( $arg, 1, 1 );
                  $value              = substr( $arg, 3 );
                  $out[ $key ]          = $value;
               }
               // -abc
               else
               {
                  $chars              = str_split( substr( $arg, 1 ) );
                  foreach ( $chars as $char )
                  {
                     $key            = $char;
                     $value          = isset( $out[ $key ] ) ? $out[ $key ] : true;
                     $out[ $key ]      = $value;
                  }
               }
            }
            // plain-arg
            else
            {
               $value                  = $arg;
               $out[]                  = $value;
            }
         }
      }
      else
      {
         if ( count( $_REQUEST ) > 0 )
         {
            foreach ( $_REQUEST as $key => $value )
            {
               $out[ $key ] = $value;
            }
         }
      }
   }
   return $out;
}


он разбирает все что передано скрипту при запуске через POST, GET либо аргументы командной строки и запихивает в возвращаемый массив. Сам метод живет в отдельном инклюднике.
И, соответственно, разбор аргументов в самом скрипте:

$arguments = parseArgs( $_SERVER, $_REQUEST );


Вызов из консоли вот такой ( хотя в принципе все ясно из кода ):
php myscript.php --firstarg=somedata -anotherarg=anotherdata --justaflag -anotherflag plainanarg
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
toxa82
@toxa82
Они уже в массиве: $argv — Array of arguments passed to script
Ответ написан
@niko83
Если не ошибаюcь в Zend есть либа для работы с консольными вызовами
Ответ написан
alexmuz
@alexmuz
Решение в лоб (наверняка можно хорошо улучшить):
<?php

$i = 0;
$params = array();
while (++$i < $argc) {
    $arg = $argv[$i];
    if (substr($arg, 0, 2) == '--') {
        $key = substr($arg, 2);
    } else if (substr($arg, 0, 1) == '-') {
        $key = substr($arg, 1);
    } else {
        $params[] = $arg;
        continue;
    }
    $i++;
    $params[$key] = isset($argv[$i]) ? $argv[$i] : '';
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы