帮助简化添加和递增“image[]”的函数到一个数组中
我最近一直在使用表单进行大量工作,并决定制作一个 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] =>
)
)
)
这里的问题是,如果添加一个“image”作为 $name,那么它必须像已发布一样添加到数组中,因此它将是 array(image =>data),如果输入image[],则为array(image=>array(0=>data))。
我发现我的代码太庞大了,我发现 parse_str,其中解析“image[]”,但它没有为我服务,因为我需要单独添加名称......
这个函数可以变得更优雅吗?
澄清:
是否有更好的方法将“name[]”添加到数组中,就好像它是要添加到数组中的名称列表的一部分一样。
所以我需要一个不会覆盖 $array 的 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
)
)
这确实会简化上述函数!
I've been working a lot with forms lately and decided to make a php script to simplify some aspects that I see myself repeating, I won't post the full monstrosity that I have created, but instead I will ask you to help me simplify the following code if possible:
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);
it makes $array into:
Array
(
[forms] => Array
(
[image] => Array
(
[0] =>
[8] =>
[1] =>
[9] =>
)
)
)
the problem here is that if you add a "image" as the $name, then it must be added to the array as if it was Posted, so it will be array(image=>data), if you enter image[], then it will be array(image=>array(0=>data)).
I find my code to be way too bulky, I found parse_str, which parses the "image[]", but it did not serve me as I need the names to be added separately...
Can this function be made more elegant?
clarification:
Is there a better way to add "name[]" into a array as if it was part of a list of names to be added to the array.
so I need a parse_str replacement that does not overwrite the $array.
Example:
$array = array();
parse_str('image[]=test',$array);
parse_str('image[]=test1',$array);
parse_str('image[]=test2',$array);
but the result looks like:
Array
(
[image] => Array
(
[0] => test2
)
)
but needs to look like:
Array
(
[image] => Array
(
[0] => test
[1] => test1
[2] => test2
)
)
This would really simplify the above function!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
也许添加 array_merge_recursive 可以帮助您稍微简化代码。从约翰的方法签名开始工作,它可能看起来像这样:
哪个(正如预期的,我相信)也会产生
希望这有帮助:)
编辑:
如果你想有完全相同的行为(在最少量的行中),你总是可以重建查询字符串,附加您的值并再次解析它。生成的代码不是最优的或漂亮的,但它完成了工作;)。图示:
会导致
Perhaps throwing in an array_merge_recursive can help you simplify your code a bit. Working from John's method signature it might look something like this :
Which (as expected, I believe) also yields
Hopefully this helps :)
edit :
If you'd like to have exactly the same behavior (in a minimal amount of lines), you could always rebuild the query string, append your value and parse it again. The resulting code isn't optimal or pretty, but it does the job ;). Illustrated :
Would result in
是的,考虑到您的澄清,再次尝试:
将返回:
好的,最后一搏!据我所知,没有合适的函数,而且整理现有代码也不是那么容易,但我尽力了!
将返回:
Right, another attempt with your clarification in mind:
Will return:
OK, one last go! There isn't a suitable function to my knowledge, and its not terribly easy to tidy your existing code more than it is, but I did my best!
Will return:
我不太确定为什么 preg 还没有被提及,但这似乎就是你真正想要的
I'm not terribly sure why preg hasn't been mentioned yet, but that seems like that would be what you really want