PHP, регулярные выражения и многоуровневые тире и группировка в соответствии с появлением строки - PullRequest
0 голосов
/ 27 января 2019

У меня есть строка, которая выглядит следующим образом:

15-02-01-0000 
15-02-02-0000
15-02-03-0000 
15-02-04-0000 
15-02-05-0000 
15-02-10-0000 
15-02-10-9100 
15-02-10-9101 
15-15-81-0000 
15-15-81-0024

Таким образом, ожидаемый результат будет: Все группировки счетов, разделенные черточками "-", например: 15-02-01-0000 есть 3 группировки

  • начало с 15
  • начало с 15-02
  • начало с 15-02-01

Таким образом, ожидаемый результат будет:

Сначала будет показано

15  --> All account start with "15"
  15-02 --> All account start with "15-02"
    15-02-01 -- All accounts start with "15-02-01"
      15-02-01-0000 
    15-02-02 -- All accounts start with 15-02-02
      15-02-02-0000
    15-02-03 -- onwards like above
      15-02-03-0000 
    15-02-04 
      15-02-04-0000 
    15-02-05 
      15-02-05-0000 
    15-02-10 
      15-02-10-0000 
      15-02-10-9100 
      15-02-10-9101 
  15-15 
    15-15-81 
      15-15-81-0000 
      15-15-81-0024

Я пытался использовать substr:

$res = substr("15-15-81-0024",3,2);
if ($res == "15") {

} else if ($res < 10 && $res != 00) {

} else {

}

Но не работает, чтобы поставить группировку.Не могли бы вы предложить какой-нибудь хороший способ?

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Я бы, вероятно, сделал что-то вроде: мог бы быть более эффективным, если бы на это было потрачено больше времени.

<?php

$random = '15-02-01-0000 
15-02-02-0000
15-02-03-0000 
15-02-04-0000 
15-02-05-0000 
15-02-10-0000 
15-02-10-9100 
15-02-10-9101 
15-15-81-0000 
15-15-81-0024';

$lines = explode(PHP_EOL, $random);
$accounts = return_count($lines);
var_dump($accounts);

function return_count($lines){
    $count_accounts = array();
    $possibilties = array();
    if(is_array($lines) && !empty($lines)){
        foreach($lines as $val){
            $line = explode('-', $val);
            array_push($possibilties, $line[0], $line[0] . '-' . $line[1], $line[0] . '-' . $line[1] . '-' . $line[2]);
        }
        foreach($possibilties as $pos){
            if(!isset($count_accounts[$pos])){ $count_accounts[$pos] = 0;}
            if(search_array($pos, $lines)){
                $count_accounts[$pos]++;
            }
        }
    }
    return $count_accounts;
}

function search_array($string, $array){
    $found = 0;
    if(is_array($array) && !empty($array)){
       foreach($array as $val){
            if (strpos($val, $string) !== false) {
                $found = 1;
            }
       }
       if($found == 1){
            return true;
       }else{
            return false;
       } 
    }else{
        return false;
    }
}

?>

Что возвращает:

array (size=10)
  15 => int 10
  '15-02' => int 8
  '15-02-01' => int 1
  '15-02-02' => int 1
  '15-02-03' => int 1
  '15-02-04' => int 1
  '15-02-05' => int 1
  '15-02-10' => int 3
  '15-15' => int 2
  '15-15-81' => int 2
0 голосов
/ 27 января 2019

Вы можете разбить все данные на - и построить массив так, как вам нужно. Обратите внимание на использование & в коде в качестве ссылки на массив результатов.

Пример:

$str = "15-02-01-0000,15-02-02-0000,15-02-03-0000,15-02-04-0000,15-02-05-0000,15-02-10-0000,15-02-10-9100,15-02-10-9101,15-15-81-0000,15-15-81-0024";
$arr = explode(",", $str);
$res = [];
foreach($arr as $e) { // for each line in your data
    $a = explode("-", $e); //break to prefix
    $current = &$res; 
    while(count($a) > 1) { // create the array to that specific place if needed
        $key = array_shift($a); // take the first key
        if (!isset($current[$key])) // if the path not exist yet create empty array 
            $current[$key] = array();
        $current = &$current[$key];
    }
    $current[] = $e; // found the right path so add the element
}

Полный результат будет в $res.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...