代码之家  ›  专栏  ›  技术社区  ›  Carlos Salazar

Dinamic解析变量到数组映射

  •  0
  • Carlos Salazar  · 技术社区  · 7 年前

    我有这个功能

        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 表示数据库中的语言id,如果您检查代码,则只有在我发送这两种语言时,它才起作用,但在某些情况下,根据用户权限,用户将能够发送

    [
      {
          "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\u map时,它失败了 syntax error, unexpected end of file

    所以问题来了,我怎样才能让这个代码工作?这样做可以吗?有更好的方法吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   u_mulder    7 年前

    了解 variadic arguments

    $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));