首页 > 解决方案 > PHP根据输入向上/向下缩放数字?

问题描述

使用字符串的长度,我想根据它向上/向下缩放字体大小。

因此,字符串长度越短,数字越大。字符串长度越大,数字越小。

但我不想做几十个 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(它们是推文)。

标签: phpnumbers

解决方案


如果y = 1/-279x + 280/279的图反映了你想要的。

请求结果图

我在 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_fRuby 方法将其转换为浮点数来防止这种情况。
  • 舍入错误,期望 0.25 并得到 0.2503213,我通过调用round(2)Ruby 方法来调整它以四舍五入到最接近的小数点。

推荐阅读