我已经创建了验证功能,这里的版本更短:
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_inpu,依此类推。
我想创建一个额外的$ valid_input [$ id]数组,它不会覆盖自身,只是在内部推送新元素。
因此新的更新代码将如下所示:
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应该防止这种行为,对吧?)。
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的旧值而不是推送元素。
有什么想法吗?也许代码有问题?这整个函数是一个名为register_setting()的函数的Wordpress回调函数,但我想它主要与PHP相关,因为WPSE上的人无法帮助我。
这正是我想要的,但为什么第3点不起作用呢?
else if($foo == "noupdate") { // it doesn't work
$valid_input[$id][] = 'something';
$valid_input[$id][] = 'something_else';
$valid_input[$id][] = 'something_else2';
}
答案 0 :(得分:5)
$ valid_input [$ id]需要在将其视为一个数组之前设置为数组。
$valid_input[$id] = array();
array_push( $valid_input[$id], "some stuff");
与[]表示法相同的处理
$valid_input[$id] = array();
$valid_input[$id][] = "some stuff";
要检查数组是否已声明,请执行以下操作:
if(!is_array($valid_input[$id]){
$valid_input[$id] = array();
}
答案 1 :(得分:4)
关键是对象作为参考传递。你需要在使用array_push函数之前克隆对象。这是一个克隆对象的示例函数:
function DeepCopy($ObjectToCopy) {
return unserialize(serialize($ObjectToCopy));
}
那么你可以这样使用它
array_push($MyObjectsArray, DeepCopy($MyObject));
答案 2 :(得分:1)
您是否可能尝试使用已存在的键值将新值推送到数组?在尝试将值/键对推送到数组之前,我会测试数组中的现有键值。例如:
if ( !isset( $arr[ $key ] ) ) {
$arr[ $key ] = $value;
} else {
echo " duplicate key value ";
}
答案 3 :(得分:0)
array_push()
或与数组追加运算符[]
一起使用的变量需要实际上是一个数组,否则这些不起作用。在对变量执行数组操作之前,请仔细检查$valid_input[$id]
中的任何内容是否为数组。检查:
if (is_array($valid_input[$id])) {
// your code
}