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

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

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

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

Q&A

解決済

2回答

561閲覧

PHPの多次元連想配列でarray_diffを使いたい

aguri

総合スコア4

PHP

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

0グッド

0クリップ

投稿2020/05/11 09:49

###実現したいこと

$arr1 から $arr2 をひいて

$compare = [
['first_id'=>2,'second_id'=>20],
['first_id'=>4,'second_id'=>40],
];

を得たいです。

###該当のソースコード

php

1$arr1 = [ 2 ['first_id'=>1,'second_id'=>10], 3 ['first_id'=>2,'second_id'=>20], 4 ['first_id'=>3,'second_id'=>30], 5 ['first_id'=>4,'second_id'=>40], 6 ['first_id'=>5,'second_id'=>50] 7]; 8$arr2 = [ 9 ['first_id'=>1,'second_id'=>10], 10 ['first_id'=>3,'second_id'=>30], 11 ['first_id'=>5,'second_id'=>50] 12];

###試したこと
検索した方法ですがこれではできませんでした。

php

1$compare = function ($x, $y) { 2 return $x['thing_id'] <=> $y['thing_id'] ?: $x['kind_id'] <=> $y['kind_id']; 3}; 4var_dump(array_merge(array_udiff($arr2, $arr1, $compare)));

続いて調べて一般的な方法を見つけたと思ったのですがこれもできませんでした。

php

1$compare = array_diff_assoc($arr1, $arr2); 2var_dump($diff);

誰かわかったらお願いします。

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

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

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

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

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

thyda.eiqau

2020/05/11 10:04

first_idとsecond_idの片方は一致するが他方は一致しない要素があった場合はどうするのですか?
aguri

2020/05/11 10:10

たしかにそうでした。first_idだけを見たいので、second_idの値は無視で大丈夫です。
thyda.eiqau

2020/05/11 10:16 編集

$arr1にはなくて$arr2だけにある要素が存在する可能性を考慮する必要がありますか?考慮するとしたら、その要素はどうするのですか?
guest

回答2

0

ベストアンサー

php

1<?php 2 3$arr1 = [ 4 ['first_id'=>1,'second_id'=>10], 5 ['first_id'=>2,'second_id'=>20], 6 ['first_id'=>3,'second_id'=>30], 7 ['first_id'=>4,'second_id'=>40], 8 ['first_id'=>5,'second_id'=>50] 9]; 10$arr2 = [ 11 ['first_id'=>1,'second_id'=>10], 12 ['first_id'=>3,'second_id'=>30], 13 ['first_id'=>5,'second_id'=>50], 14 ['first_id'=>42] 15]; 16 17// $arr1 から $arr2 の中に存在する要素を単純に取り除く場合 18$compared = array_filter($arr1, function($obj) use ($arr2) { 19 return !in_array($obj['first_id'], array_column($arr2, 'first_id')); 20}); 21print_r($compared); 22 23echo PHP_EOL . '-----' . PHP_EOL; 24 25// $arr1 と $arr2 をマージして、first_id がユニークなものを取り除く場合 26$merged = array_merge($arr1, $arr2); 27$first_ids_in_merged = array_column($merged, 'first_id'); 28$compared = array_filter($merged, function($obj) use ($first_ids_in_merged) { 29 return array_count_values($first_ids_in_merged)[$obj['first_id']] === 1; 30}); 31print_r($compared); 32

投稿2020/05/11 10:35

thyda.eiqau

総合スコア2982

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

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

aguri

2020/05/11 12:09

至れり尽くせりすぎます…永久保存版にさせて頂きます。それぞれもリンク先までありがというございました。
guest

0

PHP

1$arr3=array_map(function($x){ 2 return json_decode($x,JSON_OBJECT_AS_ARRAY); 3},array_diff( 4 array_map(function($x){ 5 return json_encode($x); 6},$arr1), 7 array_map(function($x){ 8 return json_encode($x); 9},$arr2)) 10); 11print_r($arr3);

投稿2020/05/11 10:52

yambejp

総合スコア114915

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

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

aguri

2020/05/11 12:10

array_mapをこんなに使いこなす人はじめて見ました!笑 どうもありがとうござました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問