alex_bourne
@alex_bourne

Что исправить в php-коде чтобы элементы выводились на одну строку?

Возможно мой вопрос не подходит под формат Тостера. Но попробую спросить.

Есть код на php, который генерирует схему гитарного ритма для поста в вордпрессе . Схема состоит из таблицы и картинок.

Вот так это выглядит:e8d4f53b37f94c689b4fc433a44e1f8f.pngПример страницы.

Раньше схема ритма выводилась в одну строку, но потом я попросил программиста сделать разбиение на две строки и он сделал доработку, как я понимаю ввёл дополнительную функцию. Я немного знаю php и подозреваю что это в функции "codeToPics", но что конкретно не знаю.

Прошло время, и под новый дизайн нам надо снова сделать вывод в одну строку. Тот программист сейчас к сожалению недоступен.

Вопрос: что надо исправить, чтобы сделать вывод на одну строку?

Весь код сюда вставить не получается.
Вот основная часть кода и скорее всего нужное здесь.

<?php

       public static function parse($str)
    {
        preg_match_all("|\[([A-Za-z0-9\.\/#b\+\(\)]*)@?b([0-9]+)@?([^@\[]+)?\]|", $str, $matches);
        $tm = new FilkDb(self::TBL_RHYTHM);

        if ( !empty($matches[2]) ) {
            foreach ($matches[2] as $idx => $id) {
                $chords = !empty($matches[1][$idx]) ? $matches[1][$idx] : "";
                $count = !empty($matches[3][$idx]) ? $matches[3][$idx] : "";
                /*echo "<pre>";
                var_dump($matches);
                die;*/
                $item = $tm->getById($id);
                $video = !empty($item["video"]) ? "<div style='text-align: center;'>" . $item["video"] . "</div>": "";
                $ins = "<div>" . $item["name"] . "<table style='border: 0;'><tr><td style='border: 0'>" . self::codeToPics($item["body"], $chords, $count) . "</td></tr></table>" . $video . "</div>";
                $str = str_replace($matches[0][$idx], $ins, $str);
            }
        }
        
        return $str;
    }
    
    public static function splitCounts($str)
    {
        $len = strlen($str);
        $ret = [];
        $cnt = 0;

        for($i=0; $i < $len; $i++) {
            if ($str[$i] == "-") {
                $cnt++;
                continue;
            }
            
            $ret[$cnt][] = $str[$i];
            
            if ($str[$i] == "." || ($i < $len - 1 && $str[$i+1] == ".")) {
                $cnt++;
            }
        }

        return $ret;        
    }

    public static function splitChords($str)
    {
        $len = strlen($str);
        $ret = [];
        $cnt = 0;

        for($i=0; $i < $len; $i++) {
            // echo $str[$i] . ":" . (preg_match("|[A-Z\.]|", $str[$i]) ? "Y" : "N") . "\n";
            $ret[$cnt][] = $str[$i];
            
            if ($i < $len - 1 && ($str[$i+1] == "." || ($str[$i] !== '/' && preg_match("|[A-Z]|", $str[$i+1])))) {
                $cnt++;
            }
        }
        
        return $ret;
    }
    
    public static function codeToPicsLine($code, $chordsArr, $countArr, $metre, $idxFrom, $idxTo)
    {
        $ret = "<tr>";
        for ($i=$idxFrom; $i < $idxTo; $i++) {
            $curChord = (!empty($chordsArr[$i]) && $chordsArr[$i] ? implode("", $chordsArr[$i]) : "");
            $ret .= "<td nowrap class='txt'>" . ($curChord == "." ? "" : $curChord) . "</td>";
            
            if (($i+1) % $metre == 0) {
                $ret .= "<td class='empty'><img src='" . get_template_directory_uri() . "/tabpics/empty.png' /></td>";
            }
        }
        $ret .= "</tr>";

        $ret .= "<tr>";
        for ($i=$idxFrom; $i < $idxTo; $i++) {
            
            $pic = self::mapTabPic($code[$i]);           
            $ret .= "<td class='pic'><img src='" . get_template_directory_uri() . "/tabpics/" . $pic . ".png' /></td>";
            
            if (($i+1) % $metre == 0) {
                $ret .= "<td class='empty'><img src='" . get_template_directory_uri() . "/tabpics/empty.png' /></td>";
            }
        }
        $ret .= "</tr>";

        $ret .= "<tr>";
        for ($i=$idxFrom; $i < $idxTo; $i++) {
            $ret .= "<td class='bottom'><img src='" . get_template_directory_uri() . "/tabpics/bottom.png' /></td>";
            
            if (($i+1) % $metre == 0) {
                $ret .= "<td class='empty'><img src='" . get_template_directory_uri() . "/tabpics/empty.png' /></td>";
            }
        }
        $ret .= "</tr>";

        $ret .= "<tr>";
        $metreCount = 0;
        
        for ($i=$idxFrom; $i < $idxTo; $i++) {
            $metreCount++;
            $metreCountLabel = !empty($countArr[$i]) 
                                && !empty($countArr[$i][0]) 
                                && $countArr[$i][0] !== "."
                                ? implode("", $countArr[$i]) 
                                : $metreCount;
            $ret .= "<td class='txt'>" . $metreCountLabel . "</td>";
            
            if (($i+1) % $metre == 0) {
                //$metreCount = 0;
                $ret .= "<td class='empty'><img src='" . get_template_directory_uri() . "/tabpics/empty.png' /></td>";
            }
        }
        $ret .= "</tr>";
        return $ret;
    }

    public static function codeToPics($code, $chords, $metreCount)
    {
        $code = preg_replace("|\s+|", "", trim($code));
        $len = strlen($code);
        $metre = $len % 3 == 0 ? 3 : 4;
        
        $ret = "<table class='rhythm-table'>";
        $chordsArr = $chords ? self::splitChords($chords) : [];
        $countArr = $metreCount ? self::splitCounts($metreCount) : [];

        if ($len > 2*$metre) {
            $ret .= self::codeToPicsLine($code, $chordsArr, $countArr, $metre, 0, 2*$metre);
            $ret .= self::codeToPicsLine($code, $chordsArr, $countArr, $metre, 2*$metre, $len);
        } else {
            $ret .= self::codeToPicsLine($code, $chordsArr, $countArr, $metre, 0, $len);
        }
        
        $ret .= "</table>";
        
        return $ret;
    }
    
    public static function mapTabPic($chr)
    {           
        $defaultPic = "dot";
        $map = [
            "v" => "down",
            "^" => "up",
            "x" => "x",
            "a" => "a",
            "p" => "p",
            "i" => "i",
            "m" => "m"
        ];

        $chrLower = strtolower($chr);
        return isset($map[$chrLower]) ? $map[$chrLower] : $defaultPic;
    }


Полный код тут: https://yadi.sk/d/zsx5hRUwofjHx
  • Вопрос задан
  • 198 просмотров
Решения вопроса 1
@iitovka
в функции codeToPics:
вместо
if ($len > 2*$metre) {
$ret .= self::codeToPicsLine($code, $chordsArr, $countArr, $metre, 0, 2*$metre);
$ret .= self::codeToPicsLine($code, $chordsArr, $countArr, $metre, 2*$metre, $len);
} else {
$ret .= self::codeToPicsLine($code, $chordsArr, $countArr, $metre, 0, $len);
}

оставьте

$ret .= self::codeToPicsLine($code, $chordsArr, $countArr, $metre, 0, $len);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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