Php 基于值的动态计数

Php 基于值的动态计数,php,Php,我有一个二维数组: $fruits = array ( array('fruit' => 'Apple', 'rating' => '2'), array('fruit' => 'Pear', 'rating' => '3'), array('fruit' => 'Peach', 'rating' => '2'), array('fruit' => 'Strawberry', 'rating' => '2') ); 我需要

我有一个二维数组:

$fruits = array
  (
  array('fruit' => 'Apple', 'rating' => '2'),
  array('fruit' => 'Pear', 'rating' => '3'),
  array('fruit' => 'Peach', 'rating' => '2'),
  array('fruit' => 'Strawberry', 'rating' => '2')
  );
我需要得到一个明确的命令。因此,以上面的示例为例,我想显示一个
,其中包含三个
col
s->fruit、rating和rank。如果评分相等,那么我希望在第三列中有
单选按钮
,以及可能的排名。这就是我的意思:

到目前为止,我有下面这段代码,它只能告诉是否有其他水果具有相同的评级,如果是,它显示从1-4收音机。这是一个非常粗鲁的解决办法。那么,考虑到评级可以是任何东西,我怎样才能轻松地建立它呢。例如2-2-3-3,在这种情况下,我需要无线电1-2,1-2和3-4,3-4

PHP:

echo“水果等级”;
对于($i=0;$i<计数($fruits);++$i){
回声“$FREATS[$i]['FREART'..”.$FREATS[$i]['rating'.]”;
对于($j=0;$j
基本上,我需要有一个计数每个等级的所有情况下,有一个平等


p.S.:数组已经根据评级进行了
DESC
排序,这就是为什么
($i+1)
在我的代码中起作用。

既然已经有了预排序的数组,您需要的是查找范围

获得范围后,就可以输出该行集

下面是一个例子:

echo "<table><tr><td>fruit</td><td>rating</td><td>rank</td></tr>";
$total = count($fruits);
for( $i=0; $i<$total; $i=$range_end+1) {
    $range_start = $i;
    while($i+1 < $total && $fruits[$i]['rating'] == $fruits[$i+1]['rating']) {
        $i++;
    }
    $range_end = $i;

    $range = array_slice($fruits, $range_start, $range_end-$range_start+1);
    foreach($range as $fruit) {
        echo "<tr>"
            ."<td>".$fruit['fruit']."</td>"
            ."<td>".$fruit['rating']."</td>"
            ."<td>";
        if( $range_start == $range_end) {
            echo $fruit['rating'];
        }
        else {
            for($j=$range_start; $j<=$range_end; $j++) {
                echo '<input type="radio" name="'.$fruit['fruit'].'" value="'.$j.'">'.$j;
            }
        }
        echo "</td>"
        ."</tr>";
    }
}
echo "</table>";
echo“水果等级”;
$total=计数(水果);

对于($i=0;$i),我建议如下:

$fruits = array(
  array('fruit' => 'Apple', 'rating' => '2'),
  array('fruit' => 'Pear', 'rating' => '3'),
  array('fruit' => 'Peach', 'rating' => '2'),
  array('fruit' => 'Strawberry', 'rating' => '2')
);

// get unique ratings, in descending order
$ratings = array_unique(array_column($fruits, 'rating'));
sort($ratings);
$ratings = array_fill_keys(array_reverse($ratings), array());

// put fruits in their respective rating buckets:
foreach($fruits as $fruit) {
    $ratings[$fruit['rating']][] = $fruit['fruit'];
}

// Generate the HTML table
$html = "<table border=1><tr><th>fruit</th><th>rating</th><th>rank</th></tr>";
$rank = 1;
foreach($ratings as $rating => $fruits) {
    foreach($fruits as $fruit) {
        if (count($fruits) === 1) {
            $rankHtml = "<b>$rank</b>";
        } else {
            $rankHtml = "";
            for ($i = $rank; $i < $rank + count($fruits); $i++) {
                $rankHtml .= "<input type='radio' name='$fruit' value='$i'>$i";
            }
        }
        $html .= "<tr><td>$fruit</td><td>$rating</td><td>$rankHtml</td></tr>\n";
    }
    $rank += count($fruits);
}
$html .= "</table>";

echo $html;
$fruits=数组(
数组('fruit'=>'Apple','rating'=>'2'),
数组('fruit'=>'Pear','rating'=>'3'),
数组('fruit'=>'Peach','rating'=>'2'),
数组('fruit'=>'草莓','rating'=>'2')
);
//按降序获得唯一评级
$ratings=array_unique(array_列($fruits,'rating'));
排序(评级);
$ratings=数组\填充\键(数组\反转($ratings),数组());
//将水果放入各自的分级桶中:
foreach($水果作为$水果){
$ratings[$fruit['rating'][]=$fruit['fruit'];
}
//生成HTML表
$html=“水果等级”;
$rank=1;
foreach($评级=>$水果){
foreach($水果作为$水果){
如果(计数($水果)==1){
$rankHtml=“$rank”;
}否则{
$rankHtml=“”;
对于($i=$rank;$i<$rank+count($fruits);$i++){
$rankHtml.=“$i”;
}
}
$html.=“$FROUT$评级$rankHtml\n”;
}
$rank+=计数($FREATS);
}
$html.=”;
echo$html;
如您所见,我喜欢将逻辑与输出分开。唯一的
echo
位于末尾

此方法的主要特点是中间结构,其中水果名称根据它们的共同等级分组到单独的数组中。我认为,这会产生更好的代码。

看看usort()。这可以根据自定义函数对数组重新排序(或克隆)


我需要用户告诉顺序等级是否相等。数组已经按照我在问题中提到的顺序进行了排序。这几乎是完美的。我所替换的是
echo$fruit['rating'];
如果它是
echo($I+1);
范围内唯一的一个,那么它就不会显示
等级
,而是正确的
等级
$fruits = array(
  array('fruit' => 'Apple', 'rating' => '2'),
  array('fruit' => 'Pear', 'rating' => '3'),
  array('fruit' => 'Peach', 'rating' => '2'),
  array('fruit' => 'Strawberry', 'rating' => '2')
);

// get unique ratings, in descending order
$ratings = array_unique(array_column($fruits, 'rating'));
sort($ratings);
$ratings = array_fill_keys(array_reverse($ratings), array());

// put fruits in their respective rating buckets:
foreach($fruits as $fruit) {
    $ratings[$fruit['rating']][] = $fruit['fruit'];
}

// Generate the HTML table
$html = "<table border=1><tr><th>fruit</th><th>rating</th><th>rank</th></tr>";
$rank = 1;
foreach($ratings as $rating => $fruits) {
    foreach($fruits as $fruit) {
        if (count($fruits) === 1) {
            $rankHtml = "<b>$rank</b>";
        } else {
            $rankHtml = "";
            for ($i = $rank; $i < $rank + count($fruits); $i++) {
                $rankHtml .= "<input type='radio' name='$fruit' value='$i'>$i";
            }
        }
        $html .= "<tr><td>$fruit</td><td>$rating</td><td>$rankHtml</td></tr>\n";
    }
    $rank += count($fruits);
}
$html .= "</table>";

echo $html;