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

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

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

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

Q&A

解決済

2回答

2066閲覧

php 多次元配列の重複削除方法に関して

hahanana

総合スコア5

PHP

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

0グッド

0クリップ

投稿2020/01/28 06:11

編集2020/01/28 09:10

前提・実現したいこと

PHPの多次元配列で複数の値が同じ場合削除を行いたいです。

例えば以下の場合、配列の0と2はnameとageの値が同じ削除となり、

Array ( [0] => Array ( [name] => 田中 [age] => 25 [gender] => 女性 ) [1] => Array ( [name] => 樋口 [age] => 32 [gender] => 男性 ) [2] => Array ( [name] => 田中 [age] => 25 [gender] => 男性 ) [3] => Array ( [name] => 鈴木 [age] => 65 [gender] => 男性 ) [4] => Array ( [name] => 田中 [age] => 30 [gender] => 男性 ) )

以下のような配列に作り変えたいです。gendarの重複は考慮しません。
同じ年齢の場合は削除できるようになったのですが、同じ年齢、名前の場合削除する方法がわかりません。
nameとage両方とも重複していた場合に削除、削除するものは古い、先に登録されていたものとしたいです。
この場合どのような処理にしたら良いでしょうか。

Array ( [0] => Array ( [name] => 田中 [age] => 25 [gender] => 女性 )  [1] => Array ( [name] => 樋口 [age] => 32 [gender] => 男性 ) [2] => Array ( [name] => 鈴木 [age] => 65 [gender] => 男性 ) [3] => Array ( [name] => 田中 [age] => 30 [gender] => 男性 ) )

該当のソースコード

function deleteArray($array, $column) { $tmp = []; $uniqueArray = []; foreach ($array as $value) { if (!in_array($value[$column], $tmp)) { $tmp[] = $value[$column]; $uniqueArray[] = $value; } } return $uniqueArray; } deleteArray($array, 'age');

試したこと

ソースコードを以下のように修正してみましたが期待する結果を得られませんでした。
(if文の中に&&で条件を追加)

function deleteArray($array, $column,$column2) { $tmp = []; $uniqueArray = []; foreach ($array as $value) { if (!in_array($value[$column], $tmp) && !in_array($value[$column2], $tmp)) { $tmp[] = $value[$column]; $uniqueArray[] = $value; } } return $uniqueArray; } deleteArray($array, 'age', 'name');

そもそもこのソースだと2つの要素の重複はチェックできず、別の方法に変えないといけないでしょうか。
その際どのような処理を行えばよいか教えていただけると嬉しいです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/28 08:24

例の場合、田中さんが重複(?)しているために省かれたものだと察しますが、 どういうふうにして残す方を決めるのかを示してください。 先に出現している方を残すのでしょうか?
hahanana

2020/01/28 09:00

先に出現しているほうを残したいと思っています。 宜しくお願いいたします。
guest

回答2

0

※ 途中一箇所「gendar」になってますね。
※ 元データを改変しています。

可変長で受けた方が良いかな、と思ったので変えました。

PHP

1<?php 2$array = [ 3 [ 4 'name' => '田中', 5 'age' => 25, 6 'gender' => '女性', 7 ], 8 [ 9 'name' => '樋口', 10 'age' => 32, 11 'gender' => '男性', 12 ], 13 [ 14 'name' => '田中', 15 'age' => 25, 16 'gender' => '男性', 17 ], 18 [ 19 'name' => '田中', 20 'age' => 65, 21 'gender' => '男性', 22 ], 23 [ 24 'name' => '田中', 25 'age' => 32, 26 'gender' => '男性', 27 ], 28]; 29 30function deleteArray($array, ...$columns) 31{ 32 $tmp = []; 33 $uniqueArray = []; 34 foreach ($array as $v) { 35 $id_array = []; 36 foreach ($columns as $column) { 37 $id_array[] = $v[$column]; 38 } 39 $identifier = implode(chr(31), $id_array); 40 if (in_array($identifier, $tmp) === false) { 41 $uniqueArray[] = $v; 42 $tmp[] = $identifier; 43 } 44 } 45 return $uniqueArray; 46} 47disp(deleteArray($array, 'age')); 48disp(deleteArray($array, 'age', 'name')); 49disp(deleteArray($array, 'name')); 50 51function disp($arr) { 52 foreach ($arr as $line) { 53 echo implode(' ', $line) . PHP_EOL; 54 } 55 echo PHP_EOL; 56}

・結果

(年齢のみ) 田中 25 女性 樋口 32 男性 田中 65 男性 (年齢と名前) 田中 25 女性 樋口 32 男性 田中 65 男性 田中 32 男性 (名前のみ) 田中 25 女性 樋口 32 男性

投稿2020/01/28 16:02

takepan1973

総合スコア821

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

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

0

ベストアンサー

ちょっと気持ち悪い方法を思いついたので実装してみたw

php

1<?php 2$arr = [ 3 [ 4 'a' => 'aaa', 5 'b' => 0, 6 'c' => 'hoge', 7 ], 8 [ 9 'a' => 'bbb', 10 'b' => 0, 11 'c' => 'hoge', 12 ], 13 [ 14 'a' => 'ccc', 15 'b' => 0, 16 'c' => 'hoge', 17 ], 18 [ 19 'a' => 'aaa', 20 'b' => 0, 21 'c' => 'hoge', 22 ], 23 [ 24 'a' => 'aaa', 25 'b' => 0, 26 'c' => 'fuga', 27 ], 28 [ 29 'a' => 'aaa', 30 'b' => 25, 31 'c' => 'hoge', 32 ], 33]; 34 35$count = count($arr); 36for($i = 0 ; $i < $count ; $i++){ 37 $tmp_arr[$arr[$i]['a'].'_'.$arr[$i]['b']] = $tmp_arr[$arr[$i]['a'].'_'.$arr[$i]['b']]??$i; 38} 39foreach($tmp_arr as $v){ 40 $result[$v] = $arr[$v]; 41} 42var_export($result);
array ( 0 => array ( 'a' => 'aaa', 'b' => 0, 'c' => 'hoge', ), 1 => array ( 'a' => 'bbb', 'b' => 0, 'c' => 'hoge', ), 2 => array ( 'a' => 'ccc', 'b' => 0, 'c' => 'hoge', ), 5 => array ( 'a' => 'aaa', 'b' => 25, 'c' => 'hoge', ), )

投稿2020/01/28 09:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/01/28 22:26

2次元は配列でよくね?
退会済みユーザー

退会済みユーザー

2020/01/28 22:53

$tmp_arr は多次元配列でよくね?ってことですかね? それで良いと思います(てか普通はそっちかとw) ただ、それだと、コード書くモチベーションが発生しなかったんです。 誰か書くかなぁと。 この書き方だと、取り出しが一発で書けるんですよねぇ。キモいけどw
退会済みユーザー

退会済みユーザー

2020/01/30 03:18

これ、BAに選んでますけど、実際に記述するなら、読みやすい方法で記述したほうが良いですよ。 コメントにも書きましたけど、多次元配列にすればよいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問