Как я могу удалить весь объект из массива, если он имеет пустой массив внутри? - PullRequest
0 голосов
/ 14 ноября 2018

Чего я хочу достичь?

"product_attributes": [
            {
                "title": "Color",
                "records": [
                    {
                        "attribute_name": "black",
                        "mpr": "100"
                    },
                    {
                        "attribute_name": "green",
                        "mpr": "200"
                    }
                ]
            },
            {
                "title": "RAM",
                "records": [
                    {
                        "attribute_name": "16GB",
                        "mpr": "10"
                    }
                ]
            },
            {
                "title": "RAM",///remove this whole obeject 
                "records": []
            }
        ]

что я пробовал: я извлекаю целые атрибуты из БД, затем сравниваю их с атрибутом продукта и создаю этот формат сейчас, проблема в том, что когда я начинаю обходить егоСравнение результата со всем атрибутом, который создает пустой объект каждый раз, когда выполняется условие my if ().

как я могу удалить пустой объект с пустым массивом записей и переиндексировать мой окончательный массив?

вот мой код:

$allattributes = DB::table('product_attributes')->where('subcategory_id', $product->subcat_id)->get(['attribute_title']);

                    $valuesnew = DB::table('current_product_attribute_values')->where('product_id', $product->id)->get();

                        $emptybool=false;
                    // checking for empty attributes 

                    if ($valuesnew->count() > 0) {




                        // first foreach for 3 value 
                        foreach ($allattributes as $name) {

                            //echo $name->attribute_title;

                            $boo = false;


                            //   40 record loop 

                            $records = array();
                            foreach ($valuesnew as $compare) {


                                //   if attibute title are same
                                if ($compare->attribute_title == $name->attribute_title) {

                                    if ($boo == false) {

                                        $titledata = $name->attribute_title;

                                        $holddata['title'] = $titledata;


                                        $boo = true;
                                    }

                                    $records[] = array("attribute_name" => $compare->attribute_value, "mpr" => $compare->attribute_mrp);
                                }

                            }


                            $holddata['records'] = $records;
                            $final[] = $holddata;


                        }
                    } else {
                        $final = array();
                    }

что я пробовал:

foreach($final as $k=>$arr){ 

    //$final=array_filter($arr,'count');
    if(array_filter($arr,'count') || array_values(array_filter($arr))){
        unset($arr[$i]);
}

 $i++;   

}

print_r($final);//failed

ИСПЫТАТЕЛЬНЫЙ СЛУЧАЙ:

  1. Извлечение всех атрибутов из подкатегорий, к которым относится продукт.

  2. извлечение всех атрибутов товара из таблицы атрибутов товара

  3. и сравнение заголовка всех атрибутов с атрибутами товара при обнаружении той же записи, что и у меняположить это внутри массива.поэтому я достигаю цвет => красный, черный этот тип структуры вместо цвета => красный, цвет => черный

  4. теперь тестовый случай, когда все атрибуты имеют 4 атрибута цвет, размерram, процессор и продукт, имеющие только два цвета и ram, в этом случае мой цикл дает мне пустую запись, так как с последним заголовком я хочу удалить этот объект, имеющий пустую запись.

заранее спасибо:)

all attribute table product attribute table

** NEW TRY: **

foreach($final as $k=>$arr){ 


                    foreach($arr as $key=>$value){
      $count=count($value);
      if($count==0){
          echo '<pre>';
          echo ' am empty object remove me ';
          '<br>';
          unset($arr[$index]);//failed how can i remove this whole object from the main array 


      }
  }

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

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

collect($productAttributesArray).filter(function($product){
  return !empty($product->records);
}
0 голосов
/ 14 ноября 2018

вы можете попытаться отфильтровать коллекцию для строк, в которой нет записи.

$withRecordsOnly = collect($product_attributes)->filter(function ($item) {
    return !empty($item->records);
});

$product_attributes - это тот же массив, что и у вас foreach ed.для этого нужно преобразовать массив в коллекцию и отфильтровать все объекты с непустыми записями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...