@NubasLol

Как с помощью функции array_slice удалить значение из массива?

Задание со скиллбокса. И вот то ли я дурак, и не понимаю, как с помощью этой функции удалять значение, либо задание составлял студент?

spoiler

Задание 2

Напишите генератор автомобильных номеров для серии для одного региона Российской Федерации. Ограничим буквы в возможных комбинациях А и B. Так, формат автомобильного номера имеет следующий вид: X000XX, где X — это серия, тут может быть указана любая буква, имеющая аналог в кириллическом и латинском алфавите, а 000 — номер, он может принимать любые значения от 000 до 999. В нашем случае серия ограничена комбинациями A и B.

С помощью конструкции for или while организуйте сначала цикл, который будет осуществлять перебор символов A и B (для генерации серии).
Внутри него — вложенный цикл, который будет осуществлять перебор номеров от 000 до 999.
Внутри цикла, который осуществляет перебор номеров, организуйте вывод на экран серии и номера в формате X000XX, каждый номер — с новой строки.
Добавьте массив, который будет содержать сгенерированные номера и, вместо вывода номеров на экран (внутри цикла, где вы осуществляете перебор номеров от 000 до 999), сохраните номера в этот массив.
С помощью отдельного цикла foreach выведите все номера на экран.
С помощью отдельного цикла foreach и функции array_slice удалите из массива номера, которые не содержат одинаковые цифры (то есть у вас должны остаться только номера вида 000, 111, 222, 333 и так далее).
Выведите получившийся массив на экран (после вывода всех номеров).
  • Вопрос задан
  • 577 просмотров
Решения вопроса 2
Immortal_pony
@Immortal_pony Куратор тега PHP
$numbers = [
    123,
    124,
    125,
    111,
    222,
    566,
    777,
];
$shift = 0;

foreach ($numbers as $i=>$number) {
    $digits = str_split((string)$number);
    $first = $digits[0];
    $same = true;
    
    foreach ($digits as $digit) {
        if ($digit !== $first) {
            $same = false;
            break;
        }
    }
        
    if ($same) {
        $shift++;
    } else {
        $numbers = array_merge(
            array_slice($numbers, 0, $shift),
            array_slice($numbers, $shift+1)
        ); 
    }
}


Бонусом - решение в одну строчку без всяких array_slice и foreach:
<?php
$numbers = [
    123,
    124,
    125,
    111,
    222,
    566,
    777,
];

$numbers = array_filter($numbers, function($n){ $n = (string)$n; return $n[0] == $n[1] && $n[1] == $n[2];});
Ответ написан
@Vitsliputsli
array_slice ничего не удаляет, он дает срез массива, поэтому такая формулировка не очень корректна. Исходя из этого, вы не сможете удалить элементы внутри существующего массива, и единственный вариант - это создание нового массива с выбранными значениям.
$numbers = [
    '123',
    '124',
    '125',
    '111',
    '222',
    '566',
    '777',
];

$cleanNumbers = [];
foreach ($numbers as $key=>$number) {
    // не нужно делать универсальным поиск нужных значений, т.к. он слишком специфичен, поэтому так:
    if ($number[0]===$number[1] && $number[1]===$number[2]) {
        // здесь проще было бы написать $cleanNumbers[] = $number;
        $cleanNumbers[] = array_slice($numbers, $key, 1); 
        // а если нужно все таки удаление, то достаточно unset($numbers[$i]) с противоположным условием
    }
}
var_dump($cleanNumbers);

В итоге, на кой здесь array_slice - мне совершенно не понятно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы