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;