вложенный цикл foreach в php, вызывающий дубликаты в элементах, добавляемых в массив во время цикла - PullRequest
1 голос
/ 17 апреля 2011

Я задавал этот вопрос несколько раз на форумах, посвященных php, но не получил ответа. В основном я использую codeigniter и объектный реляционный преобразователь под названием datamapper. Когда вы создаете экземпляр объекта, он сохраняет таблицу базы данных как объект, а поля - как свойства. Я пытаюсь сравнить свойства двух объектов, чтобы определить, от каких записей избавиться. В основном у меня есть что-то вроде этого:

http://blog.jeremymartin.name/2008/02/easy-multi-select-transfer-with-jquery.html#

Я уже успешно создал свою функцию добавления. Но сейчас я борюсь с функцией редактирования. Пользователь может захотеть удалить родителей, связанных с категорией, или добавить новых родителей в категорию. Поэтому мне нужно учесть это и соответственно обновить таблицу присоединения к категории category_related_categories.

Но когда я пытаюсь сравнить свойства объекта в цикле foreach, он дважды повторяет внутренний цикл и дублирует свойства:

public function update(){
        $vanity_url = new VanityUrl();
        $vanity_url->where('user_id',$this->current_user()->id)->get();

        $zones = $this->input->post('zones');
        $zone = new Zone();
        $zone->where_in('name', $zones)->get();

        $subcategory = new Category();
        $subcategory->where('id',$this->uri->segment(4))->get();

        $old_parents = new Category();
        $old_parents = $subcategory->related_category->get();

        $unneeded_ids = array(); 

        if(!$this->input->post('catupload')){
            if($subcategory->save($zone->all)){
                redirect("blogs/$vanity_url->url/categories"); 
            }
            else {
                echo "Error occurred. Please try again.";
            }
        }
        else {
            $new_parents = new Category();
            $controller = $this->input->post('catupload');
            $new_parents->where_in('controller',$controller)->get();

            foreach($new_parents as $new){ 
                foreach($old_parents as $old){
                    if($new->id != $old->id){
                        array_push($unneeded_ids, $old->id);
                    }
                }
            }
            $subcategory->delete($subcategory->related_category->where_in('id',$unneeded_ids)->get());
if($subcategory->save(array($zone->all,$new_parents->all))){
                $this->session->set_flashdata('flash_message', 'The category has been successfully updated.');
                redirect("blogs/$vanity_url->url/categories");
            }

        }
    }

Поэтому я удаляю любые отношения, которые больше не нужны пользователю, захватывая идентификаторы, которые не соответствуют тому, что выбрал пользователь, и удаляя связанные записи.

Вот проблема:

array(4) { [0]=> int(126) [1]=> int(127) [2]=> int(126) [3]=> int(127) } 

Вместо этого все должно быть так, поскольку идентификаторы нельзя дублировать:

 array(2) {[0]=> int(126) [1]=> int(127)}

Спасибо за ответ.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2011

Если вы хотите хранить уникальные элементы внутри массива, используйте его как ассоциативную карту: используйте элементы в качестве ключей.

То есть, если вы хотите сохранить элемент $id (целое число) вмассив $arr вместо

array_push($arr, $id  );

do:

$arr[$id] = $id  

или

$arr[$id] = 1; // or whatever

Впоследствии вам, вероятно, понадобится array_keys

0 голосов
/ 17 апреля 2011

Я не проверял, но не могли бы вы использовать:

foreach($new_parents as $new){ 
    foreach($old_parents as $old){
        if($new->id != $old->id && !in_array($old->id, $unneeded_ids){
            array_push($unneeded_ids, $old->id);
        }
    }
}  

.. чтобы проверить, указан ли идентификатор уже в массиве?

http://php.net/manual/en/function.in-array.php

...