Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字符串拆分为键=>;php中的值数组_Php_Arrays_String - Fatal编程技术网

将字符串拆分为键=>;php中的值数组

将字符串拆分为键=>;php中的值数组,php,arrays,string,Php,Arrays,String,上面的字符串是我试图拆分为key=>value数组或类似字符串的一个示例。字符串用于表示intranet站点的三列页面上各种类的布局,用户可以通过拖放来编辑该页面。此字符串存储在cookie中,以便下次访问时使用 数字表示类的id,-、+和x表示类的状态(最小化、扩展或隐藏),而*表示分栏符 我可以使用explode轻松地将其拆分为列,explode提供了带有3$key=>$value关联的和数组 例如 然后,我需要将其拆分为不同的类,将状态和id保持在一起。由于不同的类和状态会随着用户的不同而

上面的字符串是我试图拆分为key=>value数组或类似字符串的一个示例。字符串用于表示intranet站点的三列页面上各种类的布局,用户可以通过拖放来编辑该页面。此字符串存储在cookie中,以便下次访问时使用

数字表示类的id,-、+和x表示类的状态(最小化、扩展或隐藏),而*表示分栏符

我可以使用explode轻松地将其拆分为列,explode提供了带有3$key=>$value关联的和数组

例如

然后,我需要将其拆分为不同的类,将状态和id保持在一起。由于不同的类和状态会随着用户的不同而变化,以及每个列有多少,所以我需要能够自动完成这一切

例如

我不能完全理解这一点以及最好的方法是什么,因此非常感谢您的帮助。

首先
explode()
带分隔符的数组
*

然后可以使用preg_match_all来匹配分解数组中的每个项目。类似的内容适用于示例输入

$column1 = array( array( '+' , 2 ) , array( '-' , 1 ) , array( '+' , 18 ) )
...
示例的输出结果如下所示:

$layout = explode('*', $input);
$columns = array();
foreach ( $layout as $item ){
    $parts = array();

    //matches either a -, x or + followed by one or more digits
    preg_match_all('/([+-x])(\d+)/', $item, $matches, PREG_SET_ORDER);

    foreach ( $matches as $match){ 
        //match[1] hold the + or -, match[2] holds the digits
        $parts[] = array($match[1], $match[2]);
    }
    $columns[] = $parts;
}

在PHP5.3中,您可以使用类似的东西(未经测试)。主要区别在于,内部循环已被替换为,从而消除了对大量代码行的需要。(数组映射将函数应用于数组中的每个项,并返回转换后的数组)。nice需要PHP5.3

您还可以完全删除这些循环:

$layout = explode('*', $input);
$columns = array();
foreach ( $layout as $item ){
    preg_match_all('/([+-x])(\d+)/', $item, $matches, PREG_SET_ORDER);
    $columns[] = array_map( function($a){ return array($a[1], $a[2]); },
                            $matches);
}
但是,这有一个很大的缺点,就是大多数PHP开发人员对它的可读性不是很好,这就是为什么我不建议使用它的原因


更多解释 应

PHP 5.3版本中唯一的新功能是:

$innerMatch = function($item){
    preg_match_all('/([+-x])(\d+)/', $item, $matches, PREG_SET_ORDER);
    return array_map( function($a){ return array($a[1], $a[2]); },
                      $matches);
};
$columns = array_map($innerMatch, explode('*', $input));
稍微扩展和修改它(例如)

因此,如果
$myArray
定义为

//bind an anonymous function to the variable $func
$func = function($a){
    return $a*$a; 
}; 
//$func() now calls the anonymous function we have just defined

//then we can call it like so:
$result = array_map($func, $myArray);
当它通过数组映射函数运行时,您可以将其视为将其转换为

array(1,2,3,4);
但由于PHP不是一个函数,所有函数在遇到它们时都会立即进行求值,因此数组从array_map返回,如下所示:

array(func(1),func(2),func(3),func(4));

在实际代码中,
preg_match_all
返回匹配数组(其中匹配为数组)。因此,我所做的就是获取数组,并在每次匹配时应用一个函数,将匹配转换为所需格式的不同数组。

抱歉,澄清一下,我需要能够自动执行此操作。我应该多介绍一些关于如何使用它的信息,我现在已经做了。您能解释一下PHP5.3示例是如何工作的吗。它看起来很强大,只是想在每一块上快速分解。非常好,谢谢。这正是我需要的。我曾尝试过使用preg_split,但它去掉了分隔符,这使事情变得复杂。@Christopher我补充了一些解释
$innerMatch = function($item){
    preg_match_all('/([+-x])(\d+)/', $item, $matches, PREG_SET_ORDER);
    return array_map( function($a){ return array($a[1], $a[2]); },
                      $matches);
};
$columns = array_map($innerMatch, explode('*', $input));
array_map(
          function($a){ return array($a[1], $a[2]); },
          $matches
);
//bind an anonymous function to the variable $func
$func = function($a){
    return $a*$a; 
}; 
//$func() now calls the anonymous function we have just defined

//then we can call it like so:
$result = array_map($func, $myArray);
array(1,2,3,4);
array(func(1),func(2),func(3),func(4));
array(2, 4, 9, 16)