Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP简化范围创建_Php_Range_Simplify - Fatal编程技术网

PHP简化范围创建

PHP简化范围创建,php,range,simplify,Php,Range,Simplify,我写这段代码是为了生成一系列数字 有人能帮我简化这个代码吗。我认为这可以用更简单、更干净的方式来完成,但不知道怎么做 $variant_ids = 'AB0000001, AB0000002, AB0000003 - AB0000010, AB0000011 - AB0000020, AB0000021, AB0000022'; $delimiter = ','; $range_delimiter = '-'; $variant_ids = array_filter(array_map('tr

我写这段代码是为了生成一系列数字

有人能帮我简化这个代码吗。我认为这可以用更简单、更干净的方式来完成,但不知道怎么做

$variant_ids = 'AB0000001, AB0000002, AB0000003 - AB0000010, AB0000011 - AB0000020, AB0000021, AB0000022';
$delimiter = ',';
$range_delimiter = '-';

$variant_ids = array_filter(array_map('trim', explode($delimiter, $variant_ids)), 'strlen');

if (is_array($variant_ids)) {
    foreach ($variant_ids as &$variant_id) {
        if (strpos($variant_id, $range_delimiter) !== FALSE && substr_count($variant_id, $range_delimiter) == 1) {
            $variant_range_id = array_map('trim', explode($range_delimiter, $variant_id));
            $variant_id = array();
            for ($i = $variant_range_id[0]; $i <= $variant_range_id[1]; $i++) {
                $variant_id[] = $i;
            }
            $variant_id = implode($delimiter, $variant_id);
        }
    }
}

$variant_ids = implode($delimiter, $variant_ids);

echo '<pre>'; print_r($variant_ids); echo '</pre>';
$variant_id='AB0000001、AB0000002、AB0000003-AB0000010、AB0000011-AB0000020、AB0000021、AB0000022';
$delimiter=',';
$range_分隔符='-';
$variant_id=array_filter(数组映射('trim',explode($delimiter,$variant_id)),'strlen');
if(is_数组($variant_id)){
foreach($variant\u id as&$variant\u id){
if(strpos($variant\u id,$range\u delimiter)!==FALSE和&substr\u计数($variant\u id,$range\u delimiter)==1){
$variant\u range\u id=array\u map('trim',explode($range\u delimiter,$variant\u id));
$variant_id=array();

对于($i=$variant_range_id[0];$i这个有趣的概念,我相信PHP的内置函数可以很好地处理它。重新修改您的逻辑,使用数组和一些正则表达式处理这个概念。这并不完美,但基于您原始代码的需要,如果我自己这么说的话,这似乎是一个不错的选择

//设置基础
$raw_variant_id='AB0000001、AB0000002、AB0000003-AB0000010、AB0000011-AB0000020、AB0000021、AB0000022';
$delimiter=',';
$range_分隔符='-';
$variant_id=array();
//分解$raw_variant_id以生成数组。
$range\u array=explode($delimiter,$raw\u variant\u id);
//在$range\u数组中滚动。
foreach($range\u数组作为$range\u值){
//拆分范围值。
$range\u split=explode($range\u分隔符,$range\u值);
//如果范围分割有两个项目,则生成一个范围。否则,就像直接id一样。
如果(计数($range\U split)==2){
//获取范围开始和结束的数字。
$range_number_start=trim(preg_replace('/[a-zA-Z]/is','',$range_split[0]);
$range_number_end=trim(preg_replace('/[a-zA-Z]/is','',$range_split[1]);
//获取范围开头的字母。
$alpha_prefix=trim(preg_replace('/[0-9]/is','$range_split[0]);
//根据起始编号获取编号的长度。
$id\u length=strlen($range\u number\u start);
//现在使用“range()”生成一个范围。
$range\u span\u array=range($range\u number\u start,$range\u number\u end);
//滚动$range\u span\u数组。
foreach($range\u span\u数组作为$range\u span\u数组\u值){
$variant_id[]=$alpha_prefix.str_pad($range_span_array_value,$id_length,0,str_pad_LEFT);
}
}
否则{
foreach($range\u分割为$range\u分割值){
$variant_ids[]=修剪($range_split_value);
}
}
}
回声';
打印($variant\u id);
回声';

你能用简单的话告诉我你想做什么吗?另外,任何预期的输出我在网站的管理后端都有一个自定义表单,用户可以根据其ID选择某些产品。现在用户要求他可以在
$variant\u ids
中输入上述范围内的产品,系统应该选择所有产品因此,在使用这些ID搜索产品数据库之前,我会对用户输入的产品ID进行清理,并填补范围之间的空白。如果前缀相同,则可以使用
range()
@Nouphal.M。我决定使用
range
,但
for
循环似乎效率更高。
// Set the basics
$raw_variant_ids = 'AB0000001, AB0000002, AB0000003 - AB0000010, AB0000011 - AB0000020, AB0000021, AB0000022';
$delimiter = ',';
$range_delimiter = '-';
$variant_ids = array();

// Explode the $raw_variant_ids to generate an array.
$range_array = explode($delimiter, $raw_variant_ids);

// Roll through the $range_array.
foreach ($range_array as $range_value) {

  // Split the range value.
  $range_split = explode($range_delimiter, $range_value);

  // If the range split has two items, generate a range. Or else, just as a straight id.
  if (count($range_split) == 2) {

    // Get the numbers for the start & end of the range.
    $range_number_start = trim(preg_replace('/[a-zA-Z]/is', '', $range_split[0]));
    $range_number_end = trim(preg_replace('/[a-zA-Z]/is', '', $range_split[1]));

    // Get the letters for the start of the range. 
    $alpha_prefix = trim(preg_replace('/[0-9]/is', '', $range_split[0]));

    // Get the length of the numbers based on the start number.
    $id_length = strlen($range_number_start);

    // Now use 'range()' to generate a range.
    $range_span_array = range($range_number_start, $range_number_end);

    // Roll through the $range_span_array.
    foreach ($range_span_array as $range_span_array_value) {
      $variant_ids[] = $alpha_prefix . str_pad($range_span_array_value, $id_length, 0, STR_PAD_LEFT);
    }
  }
  else {
    foreach ($range_split as $range_split_value) {
      $variant_ids[] = trim($range_split_value);
    }
  }

}

echo '<pre>';
print_r($variant_ids);
echo '</pre>';