Я хотел делать при добавки массив из массива разбирали и если такой предмет есть то увеличиваем на нудно но если он достигает проедел ячейка 1 итема максимальный то ишем другой. Но если нету то добавляем новый. А после чего проверяют сколько я могу иметь слота если он превышает количество слотов предмета то ошибка. Я сделал так работает, но проблема том что если оба предмет не максимальный такого же типа то 1 предмет обновляет а 2 не обновляет остаток а создает новый и итог слот 3 веши. а ведь остаток если у 2 предмета хватит место то обновлять должен. $items - это который мы уже знает какие предметы есть в сумке. PS извини за русский. Ни как все правильно писать =) Код (PHP): public function getInventoryItems() { if (!$this->items AND $this->id > 0) { $res = \Service::getPDO()->prepare("SELECT `account_items`.*, `items`.`name`, `items`.`icon`, `items`.`max_count`, `items`.`buy_money`, `items`.`sell_money` FROM `account_items` LEFT JOIN `items` ON `account_items`.`item_id` = `items`.`id` WHERE `account_id` = ?"); $res->execute([$this->id]); if ($items = $res->fetchAll()) { $this->items = $items; } } return $this->items; } public function addItemInventory($new_item) { $items = $this->getInventoryItems(); $update_items = array(); foreach ($items AS &$item) { if (!isset($new_item)) { break; } if ($item['item_id'] == $new_item['item_id']) { $item_count = $item['max_count'] - $item['count']; $new_item_count = isset($new_item['count']) ? $new_item['count'] : 1; if ($item_count == 0) { continue; } else { if ($item_count < $new_item_count) { $item['count'] = $item['max_count']; $update_items[] = $item; $update_items[] = $items[] = [ 'item_id' => $new_item['item_id'], 'count' => $new_item_count - $item_count ]; unset($new_item); } else { $item['count'] += $new_item_count; $update_items[] = $item; unset($new_item); } } } } if (isset($new_item)) { $update_items[] = $new_item; } if ($this->inventory_slot >= count($items)) { foreach ($update_items AS $update_item) { if (isset($update_item['id'])) { $res = Service::getPDO()->prepare("UPDATE `account_items` SET `count` = ? WHERE `account_id` = ? AND`id` = ? LIMIT 1"); $res->execute([$update_item['count'], $this->id, $update_item['id']]); } else { $res = Service::getPDO()->prepare("INSERT INTO `account_items` (`account_id`, `item_id`, `count`) VALUES (?, ?, ?)"); $res->execute([$this->id, $update_item['item_id'], $update_item['count']]); } } return true; } return false; }
engine.energy, знаю, почему такой русский, но реально непонятно, чего тебе нужно. Приведи данные, которые на входе, и что хочешь получить на выходе в разных случаях. Без текстового описания
mkramer, суть нужно отработать проверки слотов. Я получил веши "топор" x2 и "бумага" x5 И начнет цикл на топор и бумага а может и другие.... А в сумке есть у меня бумага их 2 штук не максимальный ячейка количество. то есть оба имеет по х7 штук. Вот и алгоритм нашел такой бумага и добавляет у 1 предмет +3 так как у бумага максимальынй ячейка имеет 10 штук. Значит осталось х2 бумага на 2 предмет итог 1 предмет бумаа стало 10 а 2 предмет стало 9. и добавили предмет топор новый так как в сумке нету его. Всего предметов стало 3 штук а сумке разрешено 5 слотов для предмета. Но у меня так не выходит, ТО есть 1 обновили 10 а 2 осталось попрежнему и добавили как новый бумага итог 3 бумага и 1 топор в слоте. так не должно.. Добавлено спустя 5 минут 56 секунд: Простой пример массива Код (PHP): // id 1 = Это бумага // 1. Старт $items = array( [ 'id' => 1, 'count' => 7 ], [ 'id' => 1, 'count' => 7 ] ); // 2. Добавляю в сумку бумагу 5 шт. $add_items = array( [ 'id' => 1, 'count' => 7 ] ); // 3. Отработчик кода // 4. Итог (Должно быть!) $items = array( [ 'id' => 1, 'count' => 10 ], [ 'id' => 1, 'count' => 9 ] ); // 5. Итог (Так у меня сейчас так выходит!) $items = array( [ 'id' => 1, 'count' => 10 ], [ 'id' => 1, 'count' => 7 ], [ 'id' => 1, 'count' => 2 ] );