【问题标题】:PHP - array_push() & $array[] doesn't work?PHP - array_push() & $array[] 不起作用?
【发布时间】:2012-03-08 21:24:01
【问题描述】:

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';
    } 

【问题讨论】:

  • 所以你传递了不止一个$setting和同一个$id。您是否尝试过在循环内调试输出$id$foo 以检查它是否实际上不是导致此行为的数据。我想到了一个场景,你的$valid_input[$id] 被填满,最后一个$setting$foo == "bar" 并用$input[$id] 替换你的数组。 $settings 的一些示例数据会很有帮助。
  • Basti,好吧,我想确实出了点问题,因为每个设置都有不同的 $id :>

标签: php arrays push


【解决方案1】:

$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();
}

【讨论】:

  • 但是我将它们设置为数组,至少在第一个示例中,这两种情况都没有改变。
  • 您正在尝试将它们用作多维数组...内部数组没有被声明。尝试在推送或赋值之前添加数组声明。
  • 很抱歉,我不完全明白您的意思。没错,这些是内部数组,但我不能在 foreach 循环之前将 $valid_input[$id] 声明为数组,因为它将为所有情况创建一个数组。在推送/合并之前声明它什么都不做。
  • Ray,还是什么都没有,但请检查更新。也许,只是也许,$input[$id] 有问题?
  • 这是我听过的最荒谬的事情。谢谢!
【解决方案2】:

问题是对象作为引用传递。您需要在使用 array_push 函数之前克隆对象。这是一个克隆对象的示例函数:

function DeepCopy($ObjectToCopy) {
    return unserialize(serialize($ObjectToCopy));
}

那么你可以这样使用它

array_push($MyObjectsArray, DeepCopy($MyObject));

【讨论】:

  • $valid_input[$id] = array_push($valid_input[$id],unserialize(serialize($input[$id]))); 什么也不返回。
  • @Wordpressor:您不会像那样使用array_push() - 查看手册。 array_push() 返回数组中现在元素数量的整数值。以您在评论中的方式进行操作只是覆盖数组!
  • 做到了!非常感谢!虽然我只是在分配它并将其推送到数组之前创建了一个新对象: $dataObject = new $className; $数据对象 = ...; array_push($dataArray, $dataObject);
【解决方案3】:

您是否有可能尝试将新值推送到具有已存在键值的数组?在尝试将值/键对推送到它之前,我会测试您的数组中的现有键值。示例:

if ( !isset( $arr[ $key ] ) ) {
  $arr[ $key ] = $value;
} else {
  echo " duplicate key value ";
}

【讨论】:

  • b_dubb,不错的尝试,但事实并非如此 :(
  • 我仍然没有看到您正在测试阵列中的现有关键元素。在尝试将新值推送到该 $arr 之前,您应该测试该 $arr[ key ]
【解决方案4】:

array_push() 或与数组附加运算符 [] 一起使用的变量实际上必须是一个数组,否则这些将不起作用。在对变量进行数组操作之前,请仔细检查 $valid_input[$id] 中的任何内容是否是一个数组。做检查:

if (is_array($valid_input[$id])) {
    // your code
}

【讨论】:

  • Crontab,它们都是数组。
猜你喜欢
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2010-10-08
  • 2017-07-21
  • 2017-12-17
  • 2012-12-23
  • 1970-01-01
相关资源
最近更新 更多