В прошлой статье мы говорили о том, как превратить php скрипт в консольную команду для выполнения рутинных действий. А в этой посмотрим как разобрать аргументы командной строки в массив имя_аргумента => значение.

Разбор аргументов коммандной строки в PHP

В прошлой статье мы говорили о том, как превратить php скрипт в консольную команду для выполнения рутинных действий. А в этой посмотрим как разобрать аргументы командной строки в массив имя_аргумента => значение.

При вызове php скрипта посредством консоли ему доступны, среди прочего, следующие глобальные массивы $argv, $argc. Первый содержит все аргументы переданные скрипту, а второй количество этих аргументов, т.е. это аналог count($argv).

Вот скрипт, который разбирает аргументы командной строки и преобразует их в массив.

<<?php

function parse_arguments($argv,$argc)
{
  $_args = array(); // массив разобранных аргументов
  $delim = ',';     // разделитель нескольких параметров
  
  for ($i = 1; $i < $argc; $i++) {
      
      // регулярным выражением проверяем, есть ли нужное нам соответствие
      if (preg_match('/^--([^=]+)=(.*)/', $argv[$i], $match)) 
      {
        // если в значение аргумента есть разделитель
        if( strpos( $match[2], $delim ) !== false ) 
        {
          // преобразуем значение в массив из этих аргументов
          $_args[$match[1]] = explode( $delim, $match[2] );
        } 
        else {
          $_args[$match[1]] = $match[2];
        }
      }
  }
  
  return $_args;
  
}

// вызываем нашу функцию, передавая ей глобальные параметры $argv, $argc
$args = parse_arguments($argv,$argc);

// выводим в консоль
print_r($args);

Создаем файл parse_cli.bat следующего содержания:

@echo off

php parse_cli.php %*

Заметьте, что и файл parse_cli.php и parse_cli.bat лежат в одной папке. Однако, если вы собираетесь использовать свою команду parse_cli из любой точки ОС, то parse_cli.bat нужно положить в папку доступную в PATH, и в самом parse_cli.bat нужно прописать полный путь к файлу parse_cli.php.

Пример вызова:

C:\>parse_cli --create-controller=HomeController --views-path=home --views=index.html,login.html,dashboard.html

Вывод:

Array
(
  [create-controller] => HomeController
  [views-path] => Array
  (
    [0] => home
  )

  [views] => Array
  (
    [0] => index.html
    [1] => login.html
    [2] => dashboard.html
  )
)

Таким образом, с помощью данного простого скрипта, можно разобрать аргументы командной строки в массив, с которыми уже можно работать. Конечно, скрипт не лишен недостатков, в частности, нет должных проверок на ошибки. Но, несмотря на это, он вполне способен выполнять свои функции.