Преобразуйте строку массива PHP в массив

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

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

Принятые типы значений ограничены результатом локальной функции, которая содержит поддерживаемые типы.

Например, чтобы метод Max возвращал сравнение между int и double, возвращая результат как int, вы можете назвать его так: 110]

или, получите функцию, затем добавьте параметры при необходимости:

var operationMultiply = GetFunction<int, double, int>(OperationType.Multiply);
var result = operationMultiply(100, 120.5d);
// result = 12050

Func<T1, T2, TR> GetFunction<T1, T2, TR>(OperationType op) 
    where T1: struct where T2: struct where TR: struct
{
    if (!IsSupported(typeof(T1), typeof(T2))) {
        throw new NotSupportedException($"Operation on {typeof(T1)} and {typeof(T2)} is not supported.");
    }

    switch (op)
    {
        default:
        case OperationType.Sum:
                return (a, b) => (TR)((dynamic)a + b);
        case OperationType.Subtract:
            return (a, b) => (TR)((dynamic)a - b);
        case OperationType.Multiply:
            return (a, b) => (TR)((dynamic)a * (dynamic)b);
        case OperationType.Max:
            return (a, b) => (TR)Math.Max((dynamic)a, (dynamic)b);
    }
    bool IsSupported(Type t1, Type t2)
    {
        Type[] suppTypes = new[] { typeof(int), typeof(decimal), typeof(double), typeof(float) };
        if (!suppTypes.Contains(typeof(T1))) return false;
        if (!suppTypes.Contains(typeof(T2))) return false;
        return true;
    }
}

public enum OperationType
{
    Sum = 0, 
    Subtract,
    Multiply,
    Divide,
    Min, 
    Max,
    //Other supported operations
}
8
задан trejder 26 March 2015 в 07:42
поделиться

4 ответа

Я думаю, что Вы могли бы хотеть изучить serialize и unserialize.

$myArray = array('key1'=>'value1', 'key2'=>'value2');
$serialized = serialize($myArray);
$myNewArray = unserialize($serialized);
print_r($myNewArray); // Array ( [key1] => value1 [key2] => value2 ) 
20
ответ дан 5 December 2019 в 04:35
поделиться

сериализируйте мог бы быть правильный ответ - но я предпочитаю использовать JSON - человеческое редактирование данных будет возможно тот путь...

$myArray = array('key1'=>'value1', 'key2'=>'value2');
$serialized = json_encode($myArray);
$myNewArray = json_decode($serialized);
print_r($myNewArray); // Array ( [key1] => value1 [key2] => value2 )
19
ответ дан 5 December 2019 в 04:35
поделиться

Попытайтесь использовать var_export для генерации допустимого синтаксиса PHP, запишите, что в файл и затем 'включают' файл:

$myArray = array('key1'=>'value1', 'key2'=>'value2');
$fileContents = '<?php $myArray = '.var_export($myArray, true).'; ?>';

// ... after writing $fileContents to 'myFile.php'

include 'myFile.php';
echo $myArray['key1']; // Output: value1
7
ответ дан 5 December 2019 в 04:35
поделиться

Как насчет eval? Вы также должны использовать var_export с возвращаемой переменной как true вместо var_dump.

$myArray = array('key1'=>'value1', 'key2'=>'value2');
$fileContents = var_export($myArray, true);
eval("\$fileContentsArr = $fileContents;");
echo $fileContentsArr['key1']; //output: value1
echo $fileContentsArr['key2']; //output: value2
2
ответ дан 5 December 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: