質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

4回答

1560閲覧

PHPで昇順のソートをsort関数ではない方法で作りたい。

jj10071

総合スコア0

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/05/31 12:38

前提・実現したいこと

PHPで関数を用いずに昇順のソートを行いたいと考えています。
イメージしている手順としては、
1.配列を適当に用意する
以下をforeachで回す。
2.配列($line)から最大値を取り出す
3.最大値を別の配列(lines)に入れる
4.最大値を配列($line)から削除する

以上の手順で下記コードの$linesを昇順の配列にしたいです。

発生している問題・エラーメッセージ

エラーメッセージ

配列$lineの最大値の削除が出来ていないために、最大値を更新できず、$linesを
昇順に並べられていません。

該当のソースコード

PHP

1<?php 2$line = array(1,5,7,3,8,2,6); 3$lines = array(); 4 5foreach($line as $point){ 6 $linf = max($line); 7 $lines[] = $linf; 8 $line[] = $linf; 9 $unique = array_unique($line); 10} 11print_r($lines); 12?>

試したこと

unset();で削除してみても変わりませんでした。

補足情報(FW/ツールのバージョンなど)

申し訳ないのですが、間違えている前後のコードから教えていただけると
ありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2021/05/31 21:46

出題者の意図からすると max() もNGなのでは? たぶん配列操作系はOKだと思われますが。
guest

回答4

0

出題者の意図としては yambejp さんの通りだと思いますが
せっかくなので質問者さんの意図をくみとると…

php

1<?php 2function mymax($a) { 3 if (count($a) == 1) return $a; 4 $r = $a; 5 for ($i=1; $i<count($r); $i++) { 6 if ($r[$i - 1] > $r[$i]) { 7 $x = $r[$i]; 8 $r[$i] = $r[$i - 1]; 9 $r[$i - 1] = $x; 10 } 11 } 12 return $r; 13} 14 15$line = array(1,5,7,3,8,2,6); 16$result = array(); 17$ar = $line; 18while (!empty($ar)) { 19 $ar = mymax($ar); 20 array_unshift($result, array_pop($ar)); 21} 22 23var_dump($result); 24?>

投稿2021/06/01 20:29

takasima20

総合スコア7464

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

普通にソート処理すれば良いような気もしますが・・・

PHP

1$a=range(1,8); 2shuffle($a); 3print_r($a); 4for($i=0;$i<count($a)-1;$i++){ 5 if(($tmp=$a[$i])>$a[$i+1]){ 6 $a[$i]=$a[$i+1];$a[$i+1]=$tmp; 7 for($j=$i;$j>0;$j--){ 8 if(($tmp=$a[$j])<$a[$j-1]){ 9 $a[$j]=$a[$j-1];$a[$j-1]=$tmp; 10 }else{ 11 break; 12 } 13 } 14 } 15} 16print_r($a);

投稿2021/06/01 00:32

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

昇順の指定に対してmax選ぶあたり、なかなか尖ってますね。
minが禁止されてたりするんでしょうか。。。

ただ、質問にある方法だと、元配列から最大値を削除する際に key が必要となるので、maxではなく愚直にforeachで最大値を探した方が見通しが良さそうです。(max でも可能です)

また、元の配列から徐々に最大値を削除していく方法なので、大元のforeachforの方が扱いやすいです。

本件では元の配列に key が無いので完全に余談ですが、ソートアルゴリズムは同じ値があったとき、どう処理するかが重要になるので、せっかくなのでその辺も意識してみると良いです。

投稿2021/05/31 23:40

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

アルゴリズムの課題とかでしょうから、ポイントだけ

配列$lineの最大値の削除が出来ていないために、最大値を更新できず、$linesを

昇順に並べられていません。

  1. foreachのループ中に発生する値(質問文では$point)は標準ではループ毎にコピーされた値なので、コピーされた値をどうにかしても元の配列に影響を与えることは出来ません
  2. foreachでは配列のインデックスをコピーできる書式があります。

PHPマニュアル foreach
の各例を実際に書いてみて挙動を理解されることをお勧めします(PHPにおいて配列の扱いは非常に重要なので、後の課題でも必ず役に立ちます)

例)

こんな感じで書くと

PHP

1 2<?php 3// Your code here! 4$arr = [1,4,5,7,8]; 5 6echo "処理前"; 7var_dump($arr); 8foreach($arr as $key => $val){ 9 unset($arr[$key]); 10} 11echo "処理後"; 12var_dump($arr); 13

こうなります

処理前array(5) { [0]=> int(1) [1]=> int(4) [2]=> int(5) [3]=> int(7) [4]=> int(8) } 処理後array(0) { }

投稿2021/05/31 13:06

tanat

総合スコア18727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問