php - 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(它们是推文)。
解决方案
如果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_f
Ruby 方法将其转换为浮点数来防止这种情况。 - 舍入错误,期望 0.25 并得到 0.2503213,我通过调用
round(2)
Ruby 方法来调整它以四舍五入到最接近的小数点。
推荐阅读
- javascript - 从其他组件中的服务访问数据
- c++ - 如果参数不是引用,如何防止编译传递的 lambda
- reactjs - 使用 webpack 的 React Semantic-ui 包大小太大
- bash - AWK 中的条件
- ios - 再次出现视图时不调用drawRect
- django - 如何将对象存储在 django 模型中?
- javascript - 如何使用 ES6 导入重新导入模块
- python - Bokeh:是否可以从 bokeh.tile_providers 更改坐标参考系统?
- c#-to-vb.net - 避免跨列重复记录
- postgresql - 按日期和当天总持续时间的总和分组