【126日目】人気記事へのリンクを作成したい-3
Posted: Last Update:
数日前から「人気記事へのリンクをトップページなどに追加する」という課題に挑戦しています。昨日は配列をアクセス数順に並び替えられたものの、18あるはずのURLが8個に集約されてしまうという難問にぶち当たりました。
昨日までの成果
昨日書き直したPHPがこちらです。「$link」という関数に、URLとアクセス数を配列に入れようとしています。
$str = file("$mypath/top/access.txt");
foreach($str as $value){
$devide = strpos($value, " ");
$length = strlen($value);
$url = substr($value, 0, $devide);
$count = str_replace(" count:", "", substr($value, $devide, $length));
$link[intval($count)] = $url;
}
krsort($link);
foreach($link as $value){
echo $value."<br>";
}
?>
内容は書き出せているのですが、18あるはずのURLが、8個になってしまいました。テストのために「echo」で書き出している画面が下記。8つしかありません。
配列の設定を変えてみる
さて、8個しかURLが書き出せていない理由について少し考えてみました。アクセス数が「2」とか「1」とかのURLがあります。アクセス数をキーに代入しているので、上書きされているのではないかと予想しています。
たとえばアクセス数1の「/article/20201027」を最初に配列に入れて、次にアクセス数1の「/article/20200926」が来た時に、1番と言う番号が同じなので、上書きされてしまう、と。
この予想が正しければ、配列のキーをもう一つ設定するだけで問題は解決しますね。PHPを書き換えてみます。キーを空欄にして、URLとアクセス数を多重配列にしました。
$str = file("$mypath/top/access.txt");
foreach($str as $value){
$devide = strpos($value, " ");
$length = strlen($value);
$url = substr($value, 0, $devide);
$count = str_replace(" count:", "", substr($value, $devide, $length));
$link[] = [intval($count), $url];
}
krsort($link[0]);
foreach($link as $value){
echo $value[1]." count:".$value[0]."<br>";
}
?>
URLは全部書き出せました!一つの難関クリア!…ただ、順番が変わっていません!
配列を並び替える
配列の順番が変わっていないので、PHPの並び替え「krsort」の部分に工夫が必要そうです。配列の中身で並び替えるPHP関数は何だったか…。検索してみます。「arsort」か「rsort」でいいみたいですね。
$str = file("$mypath/top/access.txt");
foreach($str as $value){
$devide = strpos($value, " ");
$length = strlen($value);
$url = substr($value, 0, $devide);
$count = str_replace(" count:", "", substr($value, $devide, $length));
$link[] = [intval($count), $url];
}
arsort($link);
foreach($link as $value){
echo $value[1]." count:".$value[0]."<br>";
}
?>
無事に並び替えができました!
今日はここまで
おっと、今日はここで時間が来てしまいました。問題が解決できて良かったです。
明日は、この配列をもとに、アクセス数が多い記事のリンクを作成していきます!では、また明日!
