我最近一直在用表格做很多工作,并决定制作一个PHP脚本来简化我看到自己重复的一些方面,我不会发布我创建的完整怪物,但我会要求你如果可能,请帮我简化以下代码:
function add($name,$input,&$array)
{
$p = explode('[',$name);
if(isset($p[1]))
{
list($key) = explode(']',$p[1]);
if(ctype_digit($key))
{
$array['forms'][$p[0]][$key] = $input;
}else{
$array['forms'][$p[0]][] = $input;
}
}else{
$array['forms'][$name] = $input;
}
}
$array = array();
add('image[]','',$array);
add('image[8]','',$array);
add('image[1]','',$array);
add('image[]','',$array);
echo '<PLAINTEXT>';
print_r($array);
它使$ array成为:
Array
(
[forms] => Array
(
[image] => Array
(
[0] =>
[8] =>
[1] =>
[9] =>
)
)
)
这里的问题是,如果你添加一个“图像”作为$ name,那么它必须像发布一样添加到数组中,所以如果你输入它将是array(image =&gt; data) image [],然后它将是数组(image =&gt; array(0 =&gt; data))。
我觉得我的代码太笨重了,我找到了parse_str,它解析了“image []”,但它不能为我服务,因为我需要单独添加名字......
这个功能可以变得更优雅吗?
澄清:
是否有更好的方法将“name []”添加到数组中,就好像它是要添加到数组中的名称列表的一部分。
所以我需要一个不会覆盖$数组的parse_str替换。 例如:
$array = array();
parse_str('image[]=test',$array);
parse_str('image[]=test1',$array);
parse_str('image[]=test2',$array);
但结果如下:
Array
(
[image] => Array
(
[0] => test2
)
)
但需要看起来像:
Array
(
[image] => Array
(
[0] => test
[1] => test1
[2] => test2
)
)
这样可以简化上述功能!
答案 0 :(得分:1)
是的,另一次尝试澄清你的想法:
function add($name,&$array)
{
$type = explode('[',$name);
$key = str_replace(array($type['0'], ']=', '[', ']'), '', $name);
$array[$type['0']][] = $key;
}
$array = array();
add('image[]=test',$array);
add('image[test1]',$array);
add('image[]=test2',$array);
add('video[test5]',$array);
echo '<PLAINTEXT>';
print_r($array);
将返回:
Array
(
[image] => Array
(
[0] => test
[1] => test1
[2] => test2
)
[video] => Array
(
[0] => test5
)
)
好的,最后一个去!根据我的知识,没有一个合适的功能,并且它比现有代码更容易整理现有代码,但我尽了最大努力!
function add($name,&$array)
{
$type = explode('[',$name);
$key = (!empty($type[1])) ? explode(']', $type[1]) : false;
$value = str_replace(array($key[0], $type[0], ']=', '[', ']'), '', $name);
if ($key[0]) $array[$type['0']][$key[0]] = $value;
else $array[$type['0']][] = $value;
}
$array = array();
add('image[]=test',$array);
add('image[text8]=test4',$array);
add('image[]=test2',$array);
add('video[test5]',$array);
echo '<PLAINTEXT>';
print_r($array);
将返回:
Array
(
[image] => Array
(
[0] => test
[text8] => test4
[1] => test2
)
[video] => Array
(
[test5] =>
)
)
答案 1 :(得分:1)
也许抛出array_merge_recursive可以帮助您简化代码。使用John的方法签名工作可能看起来像这样:
function add($value, &$target) {
$temp = array();
parse_str($value, $temp);
$target = array_merge_recursive($target, $temp);
}
$array = array();
add('image[]=test',$array);
add('image[text8]=test4',$array);
add('image[]=test2',$array);
add('video[test5]',$array);
(正如预期的那样,我相信)也会产生
Array
(
[image] => Array
(
[0] => test
[text8] => test4
[1] => test2
)
[video] => Array
(
[test5] =>
)
)
希望这有助于:)
编辑:
如果您希望具有完全相同的行为(在最少的行数中),您可以始终重建查询字符串,追加您的值并再次解析它。结果代码不是最佳的或漂亮的,但它完成了工作;)。插图:
function add($value, &$target) {
$query = urldecode(http_build_query($target, '', '&'));
$query = "{$query}&{$value}";
parse_str($query, $target);
}
$array = array();
add($array, 'image[]');
add($array, 'image[8]=test4');
add($array, 'image[1]=test2');
add($array, 'image[]');
print_r($array);
会导致
Array
(
[image] => Array
(
[0] =>
[8] => test4
[1] => test2
[9] =>
)
)
答案 2 :(得分:1)
我不太清楚为什么还没有提到preg,但这似乎就是你真正想要的那样
function add( $input, &$target )
{
// sanity check. If the brackets are missing, add them.
if( strpos( $input, '[' ) === FALSE )
{
$input = str_replace( '=', '[]=', $input );
}
// The regex means, "Get the starting variable name segment"
// (begins with a letter here, you could just make it \w+)
// followed by the portion between the left and right brackets
// and finally by the value after the period until the end of the input
preg_match( '/^([a-zA-Z]\w*)\[(\w*)\]=?(.*)$/', $input, $matches );
// the first value in the matches array is the original string.
array_shift( $matches );
// sanity check -- if the string doesn't match the above regex, ignore it.
if( !isset( $matches[ 1 ] ) ) return;
$m1 = $matches[ 1 ];
$m2 = ( isset( $matches[ 2 ] ) )? $matches[ 2 ]: NULL;
// numeric keys are translated to the equivalent of array_push.
if( is_numeric( $m1 ) || $m1 == "" )
{
$target[ $matches[ 0 ] ][] = $m2;
}
// non-numerics are kept as is.
else
{
$target[ $matches[ 0 ] ][ $m1 ] = $m2;
}
}