1. PHP函数。
我创建了一个验证函数,以下是它的简化版本:
function my_function($input) {
$settings = my_source(); // function taht outputs a long array
foreach ($settings as $setting) {
$id = $setting['id'];
$foo = $setting['foo'];
$option = get_option('my_theme_settings');
if($foo == "bar") {
$valid_input[$id] = $input[$id];
}
}
return $valid_input;
};
基本上,它会将 $input 保存为 $valid_input。当它获得新的 $input 时,它会覆盖旧的 #valid_input,以此类推。
我想创建一个额外的 $valid_input[$id] 数组,它不会覆盖自身,而是只会向内部推送新元素。
2. Array_push() 不起作用。
因此,新的更新代码将如下所示:
function my_function($input) {
$settings = my_source(); // function taht outputs a long array
foreach ($settings as $setting) {
$id = $setting['id'];
$foo = $setting['foo'];
$option = get_option('my_theme_settings');
if($foo == "bar") {
$valid_input[$id] = $input[$id];
}
else if($foo == "noupdate") { // it doesn't work
$valid_input[$id] = array();
array_push($valid_input[$id], $input[$id]);
}
}
return $valid_input;
};
如上评论所述 - 这种方式行不通,输入始终会覆盖选项,它创建一个数组但始终只包含被新选项覆盖的一个元素(我猜array_push可以防止这种情况,对吗?)。
3. 对于 $array[] = 也是同样情况
function my_function($input) {
$settings = my_source(); // function taht outputs a long array
foreach ($settings as $setting) {
$id = $setting['id'];
$foo = $setting['foo'];
$option = get_option('my_theme_settings');
if($foo == "bar") {
$valid_input[$id] = $input[$id];
}
else if($foo == "noupdate") { // it doesn't work
$valid_input[$id][] = $input[$id];
}
}
return $valid_input;
};
然而它仍会覆盖$valid_input的旧值而不是将元素推入数组。
有什么想法吗?也许代码有问题吗?整个函数是WordPress回调函数,用于名为register_setting()的函数,但我猜这主要与PHP相关,因为WPSE上的人无法帮助我。
4. 编辑
这正是我想要的,但为什么第3点不起作用呢?
else if($foo == "noupdate") { // it doesn't work
$valid_input[$id][] = 'something';
$valid_input[$id][] = 'something_else';
$valid_input[$id][] = 'something_else2';
}
$id
传递了多个$setting
。你尝试在循环内部调试输出$id
和$foo
,以检查它是否实际上是数据导致了这种行为。我想到了一个场景,其中你的$valid_input[$id]
被填充,并且最后一个$setting
具有$foo == "bar"
并用$input[$id]
替换了你的数组。提供一些$settings
的示例数据会很有帮助。 - Basti