PHP - array_push () & $ array [] не работает? - PullRequest
4 голосов
/ 09 марта 2012

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. Когда он получает новый ввод $, он перезаписывает старый #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; 
}; 

Как упомянуто в комментарии выше - это не работает, 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. EDIT

Это именно то, что я хочу, но почему пункт 3 не работает тогда?

    else if($foo == "noupdate") { // it doesn't work
       $valid_input[$id][] = 'something';
       $valid_input[$id][] = 'something_else';
       $valid_input[$id][] = 'something_else2';
    } 

Ответы [ 4 ]

5 голосов
/ 09 марта 2012

$ 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();
}
4 голосов
/ 09 марта 2012

Дело в том, что объекты передаются как ссылки.вам нужно клонировать объекты перед использованием функции array_push.Вот пример функции, которая клонирует объект:

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

, затем вы можете использовать его следующим образом

array_push($MyObjectsArray, DeepCopy($MyObject));
1 голос
/ 09 марта 2012

Возможно ли, что вы пытаетесь вставить новое значение в массив с уже существующим значением ключа? Я бы проверил существующее значение ключа в вашем массиве, прежде чем пытаться вставить в него пару значение / ключ. Пример:

if ( !isset( $arr[ $key ] ) ) {
  $arr[ $key ] = $value;
} else {
  echo " duplicate key value ";
}
0 голосов
/ 09 марта 2012

Либо array_push(), либо переменная, используемая с оператором добавления массива [], должна фактически быть массивом, иначе они не будут работать. Дважды проверьте, что все, что находится в $valid_input[$id], является массивом перед выполнением операций с массивами над переменной. Проверьте, выполнив:

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