Php 如何对英制值数组进行排序(带分数的英寸)?

Php 如何对英制值数组进行排序(带分数的英寸)?,php,arrays,sorting,fractions,Php,Arrays,Sorting,Fractions,我使用以下代码使用本机排序算法对值进行排序 usort($this->_items, function($a, $b) { return strnatcasecmp($a['label'], $b['label']);}); 但问题是,它没有为以下各项正确排序值: $array=array( '18"', '4"', '18 1/2"', '18 1/4"'); 它应该按照以下顺序对值进行排序 4" 18" 18 1/4" 18 1/2" 有没有办法用PHP代码获得这种排序?谢谢。

我使用以下代码使用本机排序算法对值进行排序

usort($this->_items, function($a, $b) { return strnatcasecmp($a['label'], $b['label']);}); 
但问题是,它没有为以下各项正确排序值:

$array=array( '18"', '4"', '18 1/2"', '18 1/4"');
它应该按照以下顺序对值进行排序

4"
18"
18 1/4"
18 1/2"

有没有办法用PHP代码获得这种排序?谢谢。

这里有一个小解决方案():

输出:

array (
  0 => '4"',
  1 => '18"',
  2 => '18 1/4"',
  3 => '18 1/2"',
  4 => '18 11/12"',
)
foreach()
迭代
$array
并调用每个值以生成
$copy
数组值。如果包含尾随分数,则分数将转换为十进制格式并添加到整数,否则字符串值将转换为整数


然后使用
$copy
$array
进行排序。完成了

这里有一个紧凑的小解决方案():

输出:

array (
  0 => '4"',
  1 => '18"',
  2 => '18 1/4"',
  3 => '18 1/2"',
  4 => '18 11/12"',
)
foreach()
迭代
$array
并调用每个值以生成
$copy
数组值。如果包含尾随分数,则分数将转换为十进制格式并添加到整数,否则字符串值将转换为整数


然后使用
$copy
$array
进行排序。完成了

我今天遇到了一个非常类似的问题,唯一的区别是数字格式略有不同

5/8

1-3/4

2-13/54

54/64

在这种风格中,我的正则表达式解决方案是

preg_match_all("/(^.*?)-?(\d+)\/(\d+)/",$input,$matches)
与提供的答案相比,此方法的主要优点是,第一个捕获组始终与整数匹配,如果您必须为以前的正则表达式提供0 5/8或0-5/8,您可以简单地让正则表达式将第一个捕获组保留为空。在那之后,事情就这么简单了

$decimalConversion = $matches[2]/$matches[3]+$matches[1]
如果您对$matches[0]感兴趣,它将返回所有匹配项。此外,整数不与此正则表达式匹配,但由于您确实不需要对这些整数进行任何转换,只要它们仍保留在数组中,您应该仍然能够正确地进行排序

此外,我还从中引入了array\u msort,作为array\u multisort更易于阅读和使用的替代方案


之后,我使用array\u values($array)将键重置为新的排序,并通过直接写入eav\u attribute\u option表将键作为值的选项id的排序顺序传递回magento。

我今天遇到了一个非常类似的问题,唯一的区别是数字格式略有不同

5/8

1-3/4

2-13/54

54/64

在这种风格中,我的正则表达式解决方案是

preg_match_all("/(^.*?)-?(\d+)\/(\d+)/",$input,$matches)
与提供的答案相比,此方法的主要优点是,第一个捕获组始终与整数匹配,如果您必须为以前的正则表达式提供0 5/8或0-5/8,您可以简单地让正则表达式将第一个捕获组保留为空。在那之后,事情就这么简单了

$decimalConversion = $matches[2]/$matches[3]+$matches[1]
如果您对$matches[0]感兴趣,它将返回所有匹配项。此外,整数不与此正则表达式匹配,但由于您确实不需要对这些整数进行任何转换,只要它们仍保留在数组中,您应该仍然能够正确地进行排序

此外,我还从中引入了array\u msort,作为array\u multisort更易于阅读和使用的替代方案


之后,我使用array_values($array)将键重置为新的排序,并通过直接写入eav_attribute_选项表将键作为值的选项id的排序顺序传递回magento。

@p4pravin如果这不能正确排序所有可能的大小,请更新您的问题,以提供我的方法失败时的示例输入,我将修复我的代码。@p4pravin如果这不能正确排序所有可能的大小,请更新您的问题,以提供我的方法失败时的示例输入,我将修复我的代码。