Реализуйте в классе Cart метод remove для удаления продуктов. Метод должен принимать параметром название удаляемого продукта. PHP: <?php class Product { private $name; private $price; private $quantity; public function __construct($name, $price, $quantity) { $this->name = $name; $this->price = $price; $this->quantity = $quantity; } public function getCost() { return $this->price * $this->quantity; } } class Cart { private $products = []; public function add($product) { $this->products[] = $product; } public function getProduct() { return $this->products; } public function remove($name) { foreach ($this->products as $key => $value) { print_r(array_keys($this->products[$key], $name)); } } } $cart = new Cart; $cart->add(new Product('Banans', '2,99', 10)); $cart->add(new Product('Qiwi', '3,99', 15)); $cart->remove('Banans'); Хочу организовать удаление с помощью функции unset, но для начала нужно найти ключ с помощью функции array_keys, она ругается на $this->products, Warning: array_keys() expects parameter 1 to be array, object given in. Не пойму как удалить элемент? при print_r($cart->getProduct()); Выводит: Array ( [0] => Product Object ( [name: Product: private] => Banans [price: Product: private] => 2,99 [quantity: Product: private] => 10 ) [1] => Product Object ( [name: Product: private] => Qiwi [price: Product: private] => 3,99 [quantity: Product: private] => 15 ) ) Как выполнить корректный поиск чтобы добраться к нашему элементу? Вариант попроще, взял обычный двумерный массив и с помощью array_keys нашел ключ нашего массива вот что вернула функция print_r 'Array ( [0] => 0 ) Array ( )', вопрос как это подставить в unset? PHP: $arr = [['banans','2,99',15],['qiwi','4,99',10]]; $val = "banans"; foreach ($arr as $key => $value) { print_r(array_keys($arr[$key], $val)); } Заранее благодарен за помощь.
Вам нужно пройтись по массиву-результату функции array_keys и по очереди удалить все найденные значения: PHP: <?php $arr = [['banans','2,99',15],['qiwi','4,99',10]]; $val = "banans"; foreach ($arr as $key => $value) { $delete_keys = array_keys($arr[$key], $val); foreach ($delete_keys as $dkey) { unset($arr[$key][$dkey]); } } print_r($arr);
Ругается совершенно справедливо. Нужно передавать весь массив в array_keys, а ты передаёшь одно значение, которое у тебя объект. @Fibonachi, тоже что-то непотребное подсказываешь
@mkramer я подсказал то, что человек спросил: Код, что я написал работает. Проверял перед тем, как написать, поэтому не понимаю твой комментарий.
Наткнулся на такую функцию PHP: function object_to_array($data) { if (is_array($data) || is_object($data)) { $result = array(); foreach ($data as $key => $value) { $result[$key] = object_to_array($value); } return $result; } return $data; } с помощью нее надо преобразовать в массив, удалить а после назад в обект? --- Добавлено --- А если надо удалить из функции? результат работы: Array ( [0] => Array ( [1] => 2,99 [2] => 15 ) [1] => Array ( [0] => qiwi [1] => 4,99 [2] => 10 ) ) а должен быть: Array ([1] => Array ( [0] => qiwi [1] => 4,99 [2] => 10 ) ) нужно удалить ['banans','2,99',15].
@mkramer - похоже ты прав, я видимо неправильно понял суть вопроса. @4akHopic Для массива, который ты привел как упрощенный: PHP: $arr = [['banans','2,99',15],['qiwi','4,99',10]]; $val = "banans"; foreach ($arr as $key => $value) { if (!empty(array_keys($arr[$key], $val))) { unset($arr[$key]); } } print_r($arr); Результат такой, как ты написал. Но для объекта это, по идее, не будет работать.
PHP: public function remove($name) { foreach ($this->products as $key => $value) { print_r(array_keys($this->products[$key], $name)); } } Мне нужно в public function remove($name), в значение $name передать массив ['banans','2,99',15]?
@4akHopiс, тебе нужно остановиться и подумать о том, что и как ты пытаешься сделать. И зачем. Пока ты тыкаешься вообще без понимания. Задача простая, написать за тебя эти 3 строчки мне не трудно, однако, для обучения больший толк, если ты поймёшь сам и что делаешь неправильно, и как правильно. Напиши мне, кстати, алгоритм действий русским языком для начала. Но только по шагам. Вот по этому образцу: Дан массив $a = [1, 2, 3, 15, 4]; Пусть $m = 0, $n = 0; Если $n > count($a) - 1, перейти к 6 если $a[$n] > $m, пусть $m = $a[$n]; Пусть $n = $n + 1 Печатать "Максимальное число = ", $m --- Добавлено --- (я специально расписал другую задачу)
$this->products это массив с нашими элементами, мы перебираем их пока не найдем нам нужное 'banans', после выводим на экран ключ нашего значения.
Написать алгоритм действий к своему заданию? 3. Если $n > count($a) перейти к 6 - это не понятно. PHP: <?php $a = [1,2,3,15,4]; $m = 0; $n = 0; foreach ($a as $key){ if ($n>count($a)){ $m = 6; }elseif ($a[$n]>$m) $m=$a[$n]; $n = $n+1; } echo $m;
@4akHopic, перейти к 6 - значит перейти к 6 пункту. Но я не просил тебя переводить мой алгоритм в php, я просил тебя написать по этому образцу, как ты будешь делать свой. Перевёл, кстати, неверно. Я в принципе расписал, как работает foreach внутри, потому что меня такие алгоритмы учили составлять, не подразумевая циклы существующего языка программирования. --- Добавлено --- Кстати, касательно этой фигни в целом. Расскажи своими словами, зачем нам нужен цикл foreach
1. дан массив $arr = [['banans','2,99',15],['qiwi','4,99',10]]; 2. $name = 'banans', $n = 0, $m = 0; 3. Если count($arr)-1 равен 0 переходим к 9; 4. если $arr[$n][$m] не равно $name 5. $arr[$n][$m+1]; 6. если $arr[$n][$m+n] не равно $name; 7. $arr[$n+1][$m]; 8. если $arr[$n+n][$m+n] не равно $name; 9. такого елемента нет 10. echo $arr[$n][$m] Нужно ли перебирать $m если я знаю что 'banans' будет на позиции 0: [$n][0] ?
По условию задачи тебе не такой массив дан. А с какого перепуга количество элементов массива будет уменьшаться?
а такой? Array ( [0] => Product Object ( [name: Product: private] => Banans [price: Product: private] => 2,99 [quantity: Product: private] => 10 ) [1] => Product Object ( [name: Product: private] => Qiwi [price: Product: private] => 3,99 [quantity: Product: private] => 15 ) ) --- Добавлено --- цикл foreach перебирает значения массива
Ответ жутко не полный. --- Добавлено --- Опиши полностью, что и зачем в этом цикле. Дьявол всегда в мелочах
Написал функцию которая по значению $name, записывает нужный нам массив в $arr2. PHP: $arr = [['banans','2,99',15],['qiwi','4,99',10]]; $name = 'qiwi'; $arr2 = []; foreach ($arr as $key) { foreach ($key as $num) { if($name == $num){ $arr2 = $key; } } } var_dump($arr2); --- Добавлено --- перебирает элементы массива автоматически увеличивая 'счетчик' то есть при каждом проходе в значение $key подставляется следующий элемент.
Все работает корректно если установить свойство класса public. PHP: public function remove($name) { $n = 0; foreach ($this->products as $key) { foreach ($key as $num) { if($name == $num){ unset($this->products[$n]); sort($this->products); } }$n++; } return $this->products; }
Спасибо за подсказку: Пусть $n = 0; Пусть $n = $n + 1 Все работает корректно, даже если установить свойство класса private. PHP: public function remove($name) { $n = 0; foreach ($this->products as $product){ if($name == $product->getProductName()){ unset($this->products[$n]); sort($this->products); } $n++; } return $this->products; }
Есть такая возможность: явное определение скалярных типов для PHP 7. Есть два класса User и User2. Если не указывать типы явно то все работает. А если указать вылетает ошибка. Parse error: syntax error, unexpected '$name' (T_VARIABLE), expecting ')' in Класс User: PHP: <?php class User { private $name, $age; public function __construct(string $name, int $age) { $this->name = $name; $this->age = $age; } public function setAge($age) { $this->age = $age; } public function setName($name) { $this->name = $name; } public function getAge() { return $this->age; } public function getName() { return $this->name; } } ?> Класс User2 PHP: <?php require_once 'User.php'; class User2 extends User { private $salary; public function __construct(string $name, int $age, string $salary) { parent::__construct(string $name, int $age); $this->salary = $salary; } public function getSalary() { return $this->salary; } } ?> Вопрос в следующий, что это такое и как с ним бороться? Не указывать типы явно?
В объявлении функций указывать типы допустимо. А вот тут уже не объявление, а вызов и это приводит к parse error.