Как создать динамическую комбинацию с помощью php?

#php #laravel

#php #laravel

Вопрос:

У меня есть 3 массива, подобных

 $arr = [
  "color" => [["name"=>"red"]],
  "size" => [["name"=>"18 inch"], ["name"=>"15 inch"]],
  "type" => [["name"=>"plastic"]]
]
$combo = array();
    foreach ($arr['size'] as $size) {
        foreach($arr['color'] as $color){
           foreach ($arr['type'] as $type) {
               $variant =  json_encode(['size' => $size->name, 'color' => 
                                   $color->name, 'type' => $type->name]);
               array_push($combo,$variant);
           }
        }
    }
echo $combo;
  

// результат

 0 => "{"size":"15 inch","color":"yellow","type":"metal"}"
1 => "{"size":"18 inch","color":"yellow","type":"plastic"}"
  

Это работает должным образом, но вариантов может быть меньше или больше. Как я могу с этим справиться.
Например

 $arr = [
   "size" => [["name"=>"18 inch"], ["name"=>"15 inch"]],
   "type" => [["name"=>"plastic"]]
]
  

Или

  $arr = [
    "color" => [["name"=>"red"]],
    "size" => [["name"=>"18 inch"], ["name"=>"15 inch"]],
    "type" => [["name"=>"plastic"]],
    "brand" => [['name' => 'something']],
 ]
  

Комментарии:

1. вы можете создать два значения для одного индекса примерно таким образом: ["name" => ["18 inch", "15 inch"]] и вы не можете назначить два значения для индекса…

2. Кстати, ваши отчеты об ошибках отключены, но вы должны получать: Trying to get property of non-object при попытке получить доступ к свойствам массива как объекта.

3. Я не понимаю, как вы получаете результат из своих выборочных данных…

4. Кстати, это коллекция laravel. Главное, длина $arr может быть разной и иметь разные ключи

5. Существует ли какой-либо алгоритм для генерации ожидаемого массива?

Ответ №1:

Насколько я понимаю, вам нужно объединить массивы свойств в один массив объекта.

Я должен уйти сейчас, но если вам нужно объяснение, оставьте комментарий, и я обновил ответы

 $arr = [
    "color" => [["name"=>"red"],['name'=>'yellow']],
    "size" => [["name"=>"18 inch"], ["name"=>"15 inch"]],
    "type" => [["name"=>"plastic"]],
    "brand" => [['name' => 'something']],
];

function runFor($arr ,amp;$array, $keys,$index,amp;$positions){
    foreach ($arr[$keys[$index]] as $key => $espec){
        $positions[$keys[$index]] = $key;
        if($index   1 < count($keys)){
            runFor($arr,$array,$keys, $index 1,$positions);
        }else{
            $item = (object)[];
            foreach ($keys as $key){
                $item->$key = $arr[$key][$positions[$key]]['name'];
            }
            array_push($array,$item);
        }
        unset($positions[$keys[$index]]);
    }
}


$array = array();
$keys = array_keys($arr);
$positions = [];
runFor($arr,$array,$keys,0,$positions);
$combo = array();
foreach ($array as $item){
    array_push($combo,json_encode($item));
}
var_dump($combo);
  

Комментарии:

1. Спасибо за ответ, но мне нужны все доступные комбинации. В этом случае вывод будет 0 => «{«цвет»: «красный», «размер»: «18 дюймов», «тип»:»пластик», «марка»: «что-то»}» 1 => «{«размер»: «15 дюймов»}»

2. @AliagaAliyev — Я обновил свой ответ, теперь он должен решить вашу проблему. Я не понял вашу проблему, мой плохой