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

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

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

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

Q&A

解決済

1回答

1355閲覧

php 多次元配列の分割

holic

総合スコア134

PHP

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

0グッド

0クリップ

投稿2018/05/13 11:56

編集2018/05/13 22:51

前提・実現したいこと

多次元配列を一定の間隔に分割したい。
下記のようにする関数設定はありますでしょうか、もしくは自作されている方いらっしゃいますでしょうか。

該当のソースコード

php

1//多次元配列 2$list_pre = array( 3 array(1,2,3,4,5,6), 4 array(7,8,9,10,11,12), 5 array(13,14,15,16,17,18), 6 array(19,20,21,22,23,24), 7); 8 9 10//条件(横2、縦2に分割) 11//↓並び替え 12 13 14$list_after = array( 15 array( 16 array(1,2), 17 array(7,8), 18 ), 19 array( 20 array(3,4), 21 array(9,10), 22 ), 23 array( 24 array(5,6), 25 array(11,12), 26 ), 27); 28 29

php

1//多次元配列 2$list_pre = array( 3 array(1,2,3,4,5,6), 4 array(7,8,9,10,11,12), 5 array(13,14,15,16,17,18), 6 array(19,20,21,22,23,24), 7); 8 9 10//条件(横3、縦2に分割) 11//↓並び替え 12 13 14$list_after = array( 15 array( 16 array(1,2,3), 17 array(7,8,9), 18 ), 19 array( 20 array(4,5,6), 21 array(10,11,12), 22 ), 23 array( 24 array(13,14,15), 25 array(19,20,21), 26 ), 27 array( 28 array(16,17,18), 29 array(22,23,24), 30 ), 31); 32 33

●試してみたこと

試した参考ページ
http://php.net/manual/ja/function.array-chunk.php

array_chunkという関数を発見したのですが、多次元配列に対応をどうすれば良いのか悩み、断念しました。

phpまたは配列操作に詳しい方がいらっしゃいましたら、ご教示願います。
以上

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/05/13 12:47

簡単だけど、ちょっと他の奴の回答待ってみよっと。
holic

2018/05/13 15:11

lucker様 ご返答ありがとうございます。少しお時間開けてでも構いませんので、よろしくお願いいたします!!
m.ts10806

2018/05/13 21:59

このままだとやりたいことだけを記載した丸投げ質問なのでご自身でやってみたこと、調べたことを記載してください。
holic

2018/05/13 22:43 編集

mts10806様 ある配列を分割する関数としてarray_chunk($list_pre[0], 2) を発見して試してみました。しかしながら、多次元に対しての「2」の指定が困難であると頭を悩ませました。多次元に対してはこの関数は使えないかなと思いまして、悩んでいたところです
m.ts10806

2018/05/13 22:44

参考にした記事なども含めて質問本文に追加していただけますか?
guest

回答1

0

ベストアンサー

細かい仕様よくわからんけど、とりあえず、書いた。

PHP

1<?php 2 3function validate_array($array, $columns, $rows) 4{ 5 if(!is_array($array)) { throw new Exception("第一引数が配列ではありません。"); } 6 7 $elements_count = -1; 8 $count = count($array); 9 10 if($count % $rows !== 0) 11 { 12 throw new Exception("指定された行数は配列行数に対してマッチしません。"); 13 } 14 15 for($i = 0; $i < $count; $i++) 16 { 17 if(!is_array($array[$i])) 18 { 19 throw new Exception("配列の{$i}番目の要素が配列ではありません。"); 20 } 21 22 if($elements_count < 0) 23 { 24 if(count($array[$i]) % $columns !== 0) 25 { 26 throw new Exception("指定された分割数は配列の要素数に対してマッチしません。"); 27 } 28 29 $elements_count = count($array[$i]); 30 continue; 31 } 32 33 if(count($array[$i]) !== $elements_count) 34 { 35 throw new Exception("配列の{$i}番目の要素数が不正です。多次元配列ではなくジャグ配列です。"); 36 } 37 } 38 39 return; 40} 41 42function array_devide($array, $columns, $rows) 43{ 44 // 配列のヴァリデーション 45 validate_array($array, $columns, $rows); 46 47 $list_after = array(); 48 49 50 for($r = 0; $r <count($array); $r += $rows) 51 { 52 for($c = 0; $c < count($array[0]); $c += $columns) 53 { 54 $temp = array(); 55 56 for($i = 0; $i < $rows; $i++) 57 { 58 if(!isset($array[$r + $i])){ break; } 59 $temp[] = array_slice($array[$r + $i] , $c, $columns); 60 } 61 62 $list_after[] = $temp; 63 } 64 } 65 66 return $list_after; 67} 68 69//多次元配列 70$list_pre = array( 71 array(1,2,3,4,5,6), 72 array(7,8,9,10,11,12), 73 array(13,14,15,16,17,18), 74 array(19,20,21,22,23,24), 75); 76 77try 78{ 79 $list_after = array_devide($list_pre, 3, 4); 80} 81catch (Exception $ex) 82{ 83 echo $ex->getMessage(); 84 die; 85} 86 87print_r($list_after);

投稿2018/05/14 12:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

holic

2018/05/15 09:33

lucker様 バリデーションまで書いていただきありがとうございます。 ちょっと解読に時間がかかってますのでもうすこしお時間を下さい。
holic

2018/05/18 11:14 編集

lucker様 いろいろと整理しましたが、どうしてもわからないところがございます。 しかもかなり初歩的なところです。 最終生成生物が $list_afterが構築されていっているところはわかりました。 下の記述ですが、 ''$list_after[] = $temp;'' なぜこれで、$list_afterに追加されていっているのかが本当に理解できずに悩みました。 (この記述だとfor文の度に打ち消されてしまうのではないかと考えてしまいました) array_drop($list_after,$temp); みたいな感じで作っていくのかなと考えていたのですが、 すいません、その部分だけ詳細説明をお願いできませんでしょうか。 お手数とは思いますがよろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2018/05/18 11:18

んと、 $list_after = $temp; だと、$list_afterを$tempで上書きですけど、 $list_after[] = $temp; だと、配列$list_afterの末尾に要素$tempを追加するという意味になって array_push($list_after, $temp); と、ほぼ同じ意味になります。
holic

2018/05/18 11:24

今私もアパッチ環境で試してみましたが、そうだったんですね。 ” $list_after[] = $temp; だと、配列$list_afterの末尾に要素$tempを追加するという意味になって array_push($list_after, $temp); ” すいません、こんな初歩的なことも知りませんでした。長い時間お付き合いありがとうございます。 大変に勉強になる解答です。 今後ともよろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2018/05/18 11:25

うぃうぃ
holic

2018/05/18 12:14

その後いろいろと思考させていただきましたが、ほんとに勉強になる「解答」で合ったと思います。 すいませんが、フォローもさせてくださいませ!!
退会済みユーザー

退会済みユーザー

2018/05/18 12:16

うぃうぃ
holic

2018/05/20 17:17 編集

もしお時間あればご回答いただけましたらうれしいのですが。 lucker様の回答を一通り、目を通して、もう一度自分で記述してみました。 すると下記のように書いてしまったのですが、これがうまくいかない理由がよくわからなかったです。 なぜこの方法だとうまくいかないのかわかりますでしょうか。 $temp[] = array_slice($array[$r + $i] , $c, $columns); ↓ $temp[] = array_splice($array[$r + $i] , 0, $columns); array_spliceを使うことにより、元になる配列値も変更になっていきます。 ですので、切り取り指定の初期値は常に「0」になり、わかりやすいかなと考えてこのように書きました。 しかし結果はうまくいってないです。 何故なのでしょうか。
holic

2018/05/20 17:25

自己解決しました。 array_spliceをすると。 for($c = 0; $c < count($array[0]); $c += $columns) の$array[0]の数値も小さくなってしまうことが原因でした。 ですので $countColumn = count($array[0]); for($c = 0; $c < $countColumn; $c += $columns) とすることでspliceでも可能となりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問