PHP - array_push()& $ array []不起作用?

时间:2012-03-08 21:24:02

标签: php arrays push

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_inpu,依此类推。

我想创建一个额外的$ 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的旧值而不是推送元素。

有什么想法吗?也许代码有问题?这整个函数是一个名为register_setting()的函数的Wordpress回调函数,但我想它主要与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';
    } 

4 个答案:

答案 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
}