Подсказка типа многомерного массива PHP для параметра функции

В PHP можно ли указать многомерный массив в качестве параметра функции?

Конечно, вы можете ввести подсказку для одного массива как такового:

function Example(array $parameter) {}

Но если функции требуется, чтобы параметр был многомерным массивом, есть ли способ обеспечить это с помощью подсказки типа?


person Jeffrey Cordero    schedule 25.07.2016    source источник
comment
PHP не так строго типизирован, как Java или C#. Вот почему у вас даже есть такие понятия, как mixed в PHP. Таким образом, PHP не волнует, должен ли ваш массив содержать только двойные числа, строки или mixed, но, возможно, вы могли бы реализовать проверку самостоятельно, если вам нужна эта функциональность. Единственный способ подделать это - создать класс: DoubleArray возможно, а затем использовать его для Type-Hinting...   -  person Poiz    schedule 25.07.2016
comment
И под двойным вы подразумеваете многомерность или значения являются двойными (поплавками)?   -  person AbraCadaver    schedule 25.07.2016
comment
@AbraCadaver Многомерный массив, извините, я обновлю вопрос, чтобы было ясно   -  person Jeffrey Cordero    schedule 25.07.2016


Ответы (1)


Если под DoubleArray вы имели в виду только массив двойников (поплавков). Затем вы можете подделать его, используя пользовательский класс. Рассмотрим код ниже. Обратите внимание, что исходный массив содержит strings, а окончательные результаты — нет:

<?php

    class DoubleArray{
        protected $instance;
        public function __construct(array $arrDoubles) {
            foreach($arrDoubles as $key=>$double) {
                if(!is_double($double)){
                    unset($arrDoubles[$key]);
                }
            }
            $this->instance = array_values($arrDoubles);
        }

        public function push($numDouble){
            $this->instance[] = $numDouble;
        }

        public function get(){
            return $this->instance;
        }
    }

    $arr    = array(2.35, 72.9, 88.45, 42.76, "No...", 57.77,  "String is not Double");
    $da     = new DoubleArray($arr);

    var_dump(getData($da));


    function getData(DoubleArray $data){
        // ALL ARRAY FUNCTIONS STILL APPLY TO THE $doubleArray VARIABLE
        // HOWEVER TO GET THE CUSTOM DOUBLE ARRAY DATA, YOU MAY HAVE TO
        // JUST CALL THE get() METHOD ON THE DoubleArray INSTANCE: $data
        $doubleArray    = $data->get();
        return $doubleArray;
    }

    // THE var_dump(getData($da); ABOVE PRODUCES:
    array (size=5)
      0 => float 2.35
      1 => float 72.93
      2 => float 88.45
      3 => float 42.76
      4 => float 57.77
However, if by DoubleArray you meant Multidimensional Arrays, you can still fake it using a Custom Class as illustrated below.
<?php

    class DoubleArray{
        protected $instance;

        public function __construct(array $arrMDDoubles) {
            foreach($arrMDDoubles as $key=>$subArray) {
                if(!is_array($subArray)){
                    throw new Exception("DoubleArray accepts only Multidimensional Arrays...");
                }
            }
            $this->instance = $arrMDDoubles;
        }

        public function push($arrArray, $key=null){
            if(!is_array($arrArray)){
                throw new Exception("You can only Push an Array...");
            }
            if(!is_null($key)){
                $this->instance[$key]   = $arrArray;
            }else{
                $this->instance[]       = $arrArray;
            }
            return $this;
        }

        public function get(){
            return $this->instance;
        }
    }

    $arr    = array(array(2.35, 72.93,), array(88.45, 42.76), array("No...", 57.77,  "String is not Double"));
    $da     = new DoubleArray($arr);

    var_dump(getData($da));


    function getData(DoubleArray $data){
        // ALL ARRAY FUNCTIONS STILL APPLY TO THE $doubleArray VARIABLE
        // HOWEVER TO GET THE CUSTOM DOUBLE ARRAY DATA, YOU MAY HAVE TO
        // JUST CALL THE get() METHOD ON THE DoubleArray INSTANCE: $data
        $doubleArray    = $data->get();
        return $doubleArray;
    }

    // THIS TIME THE THE var_dump(getData($da) ABOVE WOULD THROW AN EXCEPTION
    // IF THE GIVEN ARRAY IS NOT MULTI-DIMENSIONAL BUT PRODUCE SOMETHING
    // LIKE THIS OTHERWISE:     
    array (size=3)
      0 => 
        array (size=2)
          0 => float 2.35
          1 => float 72.93
      1 => 
        array (size=2)
          0 => float 88.45
          1 => float 42.76
      2 => 
        array (size=3)
          0 => string 'No...' (length=5)
          1 => float 57.77
          2 => string 'String is not Double' (length=20)
person Poiz    schedule 25.07.2016
comment
Ну, по ошибке я имел в виду многомерный массив, но я не подумал об использовании класса для принудительного выбора типа параметра, спасибо! - person Jeffrey Cordero; 25.07.2016
comment
Тег multidimensional-array был там с самого начала. - person revo; 25.07.2016
comment
@revo И все же даже такой Мастер, как AbraCadaver, спросил: И под двойным значением вы подразумеваете многомерность или значения являются двойными (плавающими)? Не могли бы вы также сообщить ему об этом? - person Poiz; 25.07.2016
comment
Я не уверен, что вы имеете в виду под Мастером, но поскольку вы были первым парнем, который сделал определенное заявление о двойниках, и потому что оригинальный постер не был достаточно быстрым, чтобы ответить вам, второй парень, который пришел к этому вопросу, прочитал ваш определенный комментарий к doubles и затем не нашел ответа от оригинального постера для ясности. Поэтому он засомневался и попытался явно спросить об этом. Вы, вероятно, не заботились о тегах вопроса и, что более важно, о требованиях вопроса. Постер достаточно ясно выразил свои потребности, заявив, что Конечно, вы можете напечатать подсказку одиночный массив как таковой. - person revo; 25.07.2016