#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 — Я обновил свой ответ, теперь он должен решить вашу проблему. Я не понял вашу проблему, мой плохой