将字符串拆分为键=>;php中的值数组
上面的字符串是我试图拆分为key=>value数组或类似字符串的一个示例。字符串用于表示intranet站点的三列页面上各种类的布局,用户可以通过拖放来编辑该页面。此字符串存储在cookie中,以便下次访问时使用 数字表示类的id,-、+和x表示类的状态(最小化、扩展或隐藏),而*表示分栏符 我可以使用explode轻松地将其拆分为列,explode提供了带有3$key=>$value关联的和数组 例如 然后,我需要将其拆分为不同的类,将状态和id保持在一起。由于不同的类和状态会随着用户的不同而变化,以及每个列有多少,所以我需要能够自动完成这一切 例如 或 我不能完全理解这一点以及最好的方法是什么,因此非常感谢您的帮助。首先将字符串拆分为键=>;php中的值数组,php,arrays,string,Php,Arrays,String,上面的字符串是我试图拆分为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)