Динамический разбор переменных в array_map - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть эта функция

    public function saveVariantValue($id, $data, $langs, $field, $client)
    {
        $transformation = [];
        $parts1 = explode(';', $data[$field][1]);
        $parts2 = explode(';', $data[$field][2]);

        $tmp_arr = array_map(null, $parts1, $parts2);
        $transformation[] = array_map(
            function($v) { return array_combine(["1","2"], $v); }, 
            $tmp_arr
        );
        //here i use the transformation array//
    }

функция преобразования входного массива из этого,

[
  {
      "1": "tag_es1;tag_es2;tag_es3",
      "2": "tag_en1;tag_en2;tag_en3"
  }
]

в этот

[
  {
    {
      "1" : "tag_es1",
      "2" : "tag_en1"
    },
    {
      "1" : "tag_es2",
      "2" : "tag_en2"
    },
    {
      "1" : "tag_es3",
      "2" : "tag_en3"
    }
  }
]

каждый 1 и2 представляет идентификатор языка из базы данных. Если вы проверите код, он будет работать только в том случае, если я отправлю оба языка, но в некоторых случаях на основании разрешения пользователя пользователь сможет отправить

[
  {
      "1": "tag_es1;tag_es2;tag_es3"
  }
]

Я хочу, чтобы режим кода был динамическим, поэтому вместо объявления parts1 и parts2 я мог бы создать строку значений и затем вычислить строку, подобную этой,

$str  = '';
$eval = '';
foreach($langs as $l) {
    //i create the string "variables", the values of the "parts" must be an array, that's why the explode
    $str  .= 'parts'.$l->id.'='.serialize(explode(";", $variant[$l->id])).';&';
    //i need to pass the "parts" to array_map so i create a string to pass it as the function parameters;
    $eval .= '$parts'.$l->id.', ';
}
$str  = rtrim($str, '&');
$eval = rtrim($eval, ', ');
parse_str($str);
//if i var_dump $parts1 or $parts2 i get the correct values
$tmp_arr = array_map(null, eval($eval));//here i fail

, пока я вызываюarray_map не может выдать syntax error, unexpected end of file

, поэтому возникает вопрос: как я могу заставить этот код работать?и это нормально делать это?Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 23 сентября 2018

Прочитайте о переменных аргументах и используйте это:

$a = '1,2,3';
$b = '4,5,6';
$c = '7,8,9';
$r = [1 => $a, 2 => $b, 3 => $c];

$parts = array_map(function($v) { return explode(',', $v); }, $r);

print_r(array_map(null, ...$parts));
...