代码之家  ›  专栏  ›  技术社区  ›  Shpigford

PHP根据输入向上/向下缩放数字?

  •  0
  • Shpigford  · 技术社区  · 4 年前

    使用字符串的长度,我想在此基础上放大/缩小字体大小。

    所以,字符串长度越短,数字就越大。字符串长度越长,数字越小。

    但我不想做几十个if/else或switch语句。理想情况下,我会根据输入以编程方式缩放输出。

    像。。。

      text_length = strlen($full_text)
      size_range = range(0, 5)
      
      // if text_length = 1 then 100% of size_range
      // if text_length = 280 then 0% of size_range
    

    在这种情况下,最大文本长度为280(它们是推文)。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Danilo Cabello    4 年前

    如果情节 y = 1/-279x + 280/279 反映了你想要什么。

    plot of requested result

    我用Ruby编写了以下脚本,应该很容易翻译成PHP:

    require "bundler/inline"
    
    gemfile do
      gem "rspec"
    end
    
    require "rspec/autorun"
    
    MAX_SIZE_PERCENTAGE = 1.0
    
    def size_it(text_length, maximum_length)
      alpha = - MAX_SIZE_PERCENTAGE / (maximum_length - MAX_SIZE_PERCENTAGE)
      beta = maximum_length / (maximum_length - MAX_SIZE_PERCENTAGE)
      ((alpha * text_length) + beta).round(2)
    end
    
    RSpec.describe "dynamic size calculation" do
      it "100% when minimal size" do
        text_length = 1
        maximum_size = 280
        expect(size_it(text_length, maximum_size)).to eq(1)
      end
    
      it "75% when almost too short" do
        text_length = 70
        maximum_size = 280
        expect(size_it(text_length, maximum_size)).to eq(0.75)
      end
    
      it "50% when half point" do
        text_length = 140
        maximum_size = 280
        expect(size_it(text_length, maximum_size)).to eq(0.5)
      end
    
      it "25% when almost too long" do
        text_length = 210
        maximum_size = 280
        expect(size_it(text_length, maximum_size)).to eq(0.25)
      end
    
      it "0% when maximum size" do
        text_length = 280
        maximum_size = 280
        expect(size_it(text_length, maximum_size)).to eq(0)
      end
    end
    

    数学是直观的,有一些地雷:

    • 整数除法,例如1/280导致0而不是0.0003,我通过调用 .to_f ,Ruby的方式来铸造浮动。
    • 舍入误差,预期为0.25,实际为0.2503213,我通过调用进行了调整 round(2) ,Ruby四舍五入到最接近的小数点。