Как сравнить числа из элементов массива, а затем получить общие числа с начала php

Проблема 1:
массив(670006151,670006152,670006251)
вывод: 670006151,152,251

Проблема 2:
массив(670006151,670006154,670006158)
вывод: 670006151,4,8

Проблема 3:
массив(670006151,670006154,670006161)
вывод: 670006151,54,61

кто-нибудь знает, как получить вывод из разных массивов, мне нужно найти общий номер с самого начала, а затем добавить другие элементы в вышеуказанных задачах 670006 является общим во всем, это может быть любое число...

Не могли бы вы написать свой проверенный, воспроизводимый код php в своем вопросе?

myeongkil kim 23.12.2020 13:04

Итак, самый длинный общий префикс среди строк?

nice_dev 23.12.2020 13:29

Каков желаемый результат для array(670006151,670006151,670006151)?

nice_dev 23.12.2020 13:32

Спасибо, @nice_dev.

Muzafar Ali 23.12.2020 16:54

Спасибо, @nick оба решения работают

Muzafar Ali 23.12.2020 16:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
5
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Один из способов сделать это — разделить каждое из чисел на возрастающую степень 10, остановившись, когда результат будет одинаковым для каждого из них. Затем вычтите этот результат, умноженный на мощность, от 2-го до последнего элемента массива:

function common_parts($data) {
    for ($b = 1; ; $b *= 10) {
        $base = intdiv($data[0], $b);
        $matches = array_filter($data, function ($v) use ($b, $base) { return intdiv($v, $b) != $base; });
        if (count($matches) == 0) break;
    }
    $base *= $b;
    for ($i = 1; $i < count($data); $i++) {
        $data[$i] = $data[$i] - $base;
    }
    return $data;
}

print_r(common_parts(array(670006151,670006152,670006251)));
print_r(common_parts(array(670006151,670006154,670006158)));
print_r(common_parts(array(670006151,670006154,670006161)));

Выход:

Array
(
    [0] => 670006151
    [1] => 152
    [2] => 251
)
Array
(
    [0] => 670006151
    [1] => 4
    [2] => 8
)
Array
(
    [0] => 670006151
    [1] => 54
    [2] => 61
)

Демо на 3v4l.org

ВАУ... не буду публиковать свое решение

Angel Deykov 23.12.2020 12:55

Вы должны - всегда приятно видеть несколько способов решения проблемы

Nick 23.12.2020 13:08
  • Перебрать все элементы массива.
  • Преобразуйте каждое число в строку.
  • Сравните текущий самый длинный префикс, который у вас есть, с текущим имеющимся номером.
  • Немедленно прервите и обновите самый длинный общий префикс, как только обнаружите несоответствие.
  • Снова выполните цикл по набору данных и удалите самый длинный вычисленный префикс и добавьте остаток текущего числа в итерации к результату.

Фрагмент:

<?php

    function getPrefixedData($arr){
        if (count($arr) == 0) return [];
        $longest_prefix = strval($arr[0]);
        foreach($arr as $val){
            $val = strval($val);
            $len = strlen($longest_prefix);
            for($i=0;$i<$len;++$i){
                if ($longest_prefix[$i] != $val[$i]){
                    $longest_prefix = substr($longest_prefix,0,$i);
                    break;
                }
            }
        }
        
        $res = [];
        $len = strlen($longest_prefix);
        foreach($arr as $index => $val){
            if ($index == 0) $res[] = $longest_prefix . substr(strval($val),$len);
            else $res[] = substr(strval($val),$len);
        }
        
        return $res;
    }

Скрипка здесь

Другие вопросы по теме