首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >根据关键结果以优雅的方式抓取中间的x个结果

根据关键结果以优雅的方式抓取中间的x个结果
EN

Stack Overflow用户
提问于 2018-06-09 05:47:34
回答 2查看 29关注 0票数 0

我有一套产品。根据页面的状态,我显示一个产品,然后最多显示4个其他产品。产品的结果集可以是大于5个产品的任意大小。我想一直展示5种产品。如果可用,我想显示下面的2个产品(在结果集中)和上面的2个产品。

示例:

如果有10个结果,关键乘积是5。我想显示3,4,5,6,7。

如果有10个结果,关键乘积是9,我想显示6,7,8,9,10。

如果有10个结果,关键乘积是1。我想显示1,2,3,4,5。

现在我正在使用min()和max()和一些“IF”来解决这个问题,这需要大量的代码,当有一个优雅的解决方案时,我就是找不到它!下面是数组结果集示例

代码语言:javascript
复制
$similar_products = array(
  array(
    "id" => 1,
    "title" => "Product One"
  ),
  array(
    "id" => 2,
    "title" => "Product Two"
  ),
  array(
    "id" => 3,
    "title" => "Product Three"
  ),
  array(
    "id" => 4,
    "title" => "Product Four"
  ),
  array(
    "id" => 5,
    "title" => "Product Five"
  ),
  array(
    "id" => 6,
    "title" => "Product Six"
  ),
  array(
    "id" => 7,
    "title" => "Product Seven"
  ),
  array(
    "id" => 8,
    "title" => "Product Eight"
  ),
  array(
    "id" => 9,
    "title" => "Product Nine"
  ),
  array(
    "id" => 10,
    "title" => "Product Ten"
  )
);
$i = 8; //change this value to test different key product array positions
$arrOut = array();
$floor = 0;
if($i <= 1) { //the key product is either in the first or second position in the array
  $floor = 0;
  $arrOut[] = $similar_products[0];
  $arrOut[] = $similar_products[1];
  $arrOut[] = $similar_products[2];
  $arrOut[] = $similar_products[3];
  $arrOut[] = $similar_products[4];
} elseif((count($similar_products)-1)-$i <= 1) {  //the key product is either in the last or second to last in the array
  $floor = count($similar_products)-5;
  $arrOut[] = $similar_products[count($similar_products)-5];
  $arrOut[] = $similar_products[count($similar_products)-4];
  $arrOut[] = $similar_products[count($similar_products)-3];
  $arrOut[] = $similar_products[count($similar_products)-2];
  $arrOut[] = $similar_products[count($similar_products)-1];
} else {  //otherwise, just grab two above and two below
  $floor = $i-2;
  $arrOut[] = $similar_products[$i-2];
  $arrOut[] = $similar_products[$i-1];
  $arrOut[] = $similar_products[$i];
  $arrOut[] = $similar_products[$i+1];
  $arrOut[] = $similar_products[$i+2];
}
$x = $floor;  //set x, our counter, to the floor (floor = the very first output postion)
foreach($arrOut as $ao) {
  if($x == $i) {  //current key product
    echo "<strong>" . $ao['id'] . ":" . $ao['title'] . "</strong><hr/>";
  } else {  //other NON key products
    echo $ao['id'] . ":" . $ao['title'] . "<hr/>";
  }
  $x++;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-12 03:02:05

如果你愿意,你可以删除变量config,把它压缩一下,使它成为一行;-)我不擅长这种东西,所以可能有更有效和/或更短的选择。

代码语言:javascript
复制
// Set array index, starts with 0
// If you need to find with specific ID, just find the index by the ID
$primaryIndex = 4;// change this number to test

// How many extra items to show
// Must be divisible by 2
$extraToShow = 4;

// Find total items available - 1 to work with array indexes
$maxIndex = count($similar_products) - 1;

// Find the slice start
$low = min($maxIndex - $extraToShow, max(0, $primaryIndex - 1 - $extraToShow / 2));

// Slice to needed
$items = array_slice($similar_products, $low, $extraToShow + 1);

var_dump($items);
票数 1
EN

Stack Overflow用户

发布于 2018-06-09 06:30:56

代码语言:javascript
复制
<?php
// example code
$productKey = 7;
$resultsShown = 5; 
$totalResults = 10;//num_rows()?
$limit = floor($resultsShown/2);
$min = $limit;
$max = $totalResults - $limit;
if($productKey<=$min){
for($i = 1;$i<=$resultsShown; $i++){
//Display result
echo $i;
}
}
else if($productKey>$max){
for( $i = $totalResults - $resultsShown+1; $i <=$totalResults;$i++){
//Display result
echo $i;
}}
else{
for( $i = $productKey - $limit; $i<=$productKey + $limit; $i++){
//Display result
echo $i;
}
}

我还没有机会测试,因为我在移动设备上,但我能想到的最简单的方法是解决问题,同时让你有机会在未来改变这些固定的限制,不优雅,但看不到你现在有什么可比较的!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50768792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档