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

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

ただいまの
回答率

88.93%

配列の処理で困っています

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 832

hidepon

score 188

PHPでの配列処理で困っています。
基本的なことだとは思っているのですが、挙動がうまくいかず・・

下記のような配列があります。

Array
(
    [0] => Array
        (
            [no] => 155
            [name] => てすと52
            [code_d] => 3
            [name_v] => q
        )

    [1] => Array
        (
            [no] => 016
            [name] => てすと46
            [code_d] => 1
            [name_v] => d
        )

    [2] => Array
        (
            [no] => 130
            [name] => てすと43
            [code_d] => 3
            [name_v] => q
        )

    [3] => Array
        (
            [no] => 076
            [name] => てすと1
            [code_d] => 1
            [name_v] => s
        )

    [4] => Array
        (
            [no] => 003
            [name] => てすと3
            [code_d] => 1
            [name_v] => s
        )

    [5] => Array
        (
            [no] => 007
            [name] => てすと4
            [code_d] => 2
            [name_v] => e
        )

    [6] => Array
        (
            [no] => 008
            [name] => てすと5
            [code_d] => 3
            [name_v] => w
        )

    [7] => Array
        (
            [no] => 010
            [name] => てすと7
            [code_d] => 2
            [name_v] => e
        )

    [8] => Array
        (
            [no] => 011
            [name] => てすと8
            [code_d] => 2
            [name_v] => w
        )

    [9] => Array
        (
            [no] => 012
            [name] => てすと9
            [code_d] => 1
            [name_v] => r
        )

    [10] => Array
        (
            [no] => 121
            [name] => てすと11
            [code_d] => 2
            [name_v] => q
        )

    [11] => Array
        (
            [no] => 001
            [name] => てすと12
            [code_d] => 3
            [name_v] => w
        )

    [12] => Array
        (
            [no] => 020
            [name] => てすと13
            [code_d] => 1
            [name_v] => e
        )

    [13] => Array
        (
            [no] => 025
            [name] => てすと14
            [code_d] => 1
            [name_v] => e
        )

    [14] => Array
        (
            [no] => 030
            [name] => てすと15
            [code_d] => 2
            [name_v] => e
        )

    [15] => Array
        (
            [no] => 035
            [name] => てすと16
            [code_d] => 1
            [name_v] => d
        )

    [16] => Array
        (
            [no] => 045
            [name] =>てすと18
            [code_v] => 2
            [name_d] => b
        )

    [17] => Array
        (
            [no] => 050
            [name] => てすと19
            [code_d] => 1
            [name_d] => a
        )

)


この配列に対して

Array
(
    [0] => 001
    [1] => 010
    [2] => 016
    [3] => 121
)


の配列の値と上の配列のno の値と一致しない配列を新たな配列として取り出したいと思っています。

結果として以下のような配列を取り出したいのですが、実現できていません。

Array
(
    [0] => Array
        (
            [no] => 155
            [name] => てすと52
            [code_d] => 3
            [name_v] => q
        )

    [1] => Array
        (
            [no] => 130
            [name] => てすと43
            [code_d] => 3
            [name_v] => q
        )

    [2] => Array
        (
            [no] => 076
            [name] => てすと1
            [code_d] => 1
            [name_v] => s
        )

    [3] => Array
        (
            [no] => 003
            [name] => てすと3
            [code_d] => 1
            [name_v] => s
        )

    [4] => Array
        (
            [no] => 007
            [name] => てすと4
            [code_d] => 2
            [name_v] => e
        )

    [5] => Array
        (
            [no] => 008
            [name] => てすと5
            [code_d] => 3
            [name_v] => w
        )

    [6] => Array
        (
            [no] => 011
            [name] => てすと8
            [code_d] => 2
            [name_v] => w
        )

    [7] => Array
        (
            [no] => 012
            [name] => てすと9
            [code_d] => 1
            [name_v] => r
        )



    [8] => Array
        (
            [no] => 020
            [name] => てすと13
            [code_d] => 1
            [name_v] => e
        )

    [9] => Array
        (
            [no] => 025
            [name] => てすと14
            [code_d] => 1
            [name_v] => e
        )

    [10] => Array
        (
            [no] => 030
            [name] => てすと15
            [code_d] => 2
            [name_v] => e
        )

    [11] => Array
        (
            [no] => 035
            [name] => てすと16
            [code_d] => 1
            [name_v] => d
        )

    [12] => Array
        (
            [no] => 045
            [name] =>てすと18
            [code_v] => 2
            [name_d] => b
        )

    [13] => Array
        (
            [no] => 050
            [name] => てすと19
            [code_d] => 1
            [name_d] => a
        )

)


上の配列をarray 下の配列をtemp_arrayとして処理をしようとしました

foreach($array as $key => $value){
    foreach($temp_array as $keys => $values){
        if($values != $value["no"]){
            $new_array[$values]=$value;
        }
    }
}

なぜかうまくいかず困っています。
宜しくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

ちょっと実行環境が無いので確認が出来ないのですが、array_filterを使って

$new_array = array_filter($array, function($a) use ($temp_array) { return !in_array($temp_array, $a['no']); });


のような感じでしょうか? 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

こんな感じですかね。

$new_array = [];
foreach($array as $key => $value) {
    if (in_array($value['no'], $temp_array)) {
      continue;
    }
    $new_array[] = $value;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/08 13:45

    ご返答有難うございます。こちらの記述でうまくいきました。いろいろと方法はあるんですね。参考になりました。奥深いです。

    キャンセル

+1

ちゃんと4つ分減ってるので出来てそうですが。
ただキー名がコードに書かているようにtemp_arrayの値ではないので、実際の処理はこうなってないですか?

$new_array[]=$value;

追記
二回目のループ内で配列への追加をしてしまっているのが原因です。
ベタな書き方ですが、下記のような感じにすると良いと思います。

foreach($array as $key => $value){
    $add_flag = true;
    foreach($temp_array as $keys => $values){
        if($values == $value["no"]){
            $add_flag = false;
            break;
        }
    }
    if($add_flag){
        $new_array[]=$value;
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/08 08:48

    ご返答有難うございます。4つ減っているのは、「こうなってほしい」という内容で実現できていないんです。生成される配列のkey の部分はこだわっていないです。
    宜しくお願いいたします。

    キャンセル

  • 2017/06/08 09:05

    なるほど、理解しました。
    修正案を追記しておきましたので参考にしてください。

    キャンセル

+1

一致するものをスキップしてみました

$new_array=array();
foreach($array as $key => $value){
    foreach($temp_array as $keys => $values){
        if($values == $value['no']){
            continue 2;
        }
    }
    $new_array[]=$value;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/08 13:44

    有難うございます。なるほど、こういう考え方もあるんですね。とても参考になりました。

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る