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

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

ただいまの
回答率

87.59%

PHPの連想配列で複数のキーに一つの値を入れ置換したい場合

解決済

回答 4

投稿 編集

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

score 6

*編集前の質問を消してしまったため、後半に追記しました。
ご迷惑をおかけ申し訳ありません。

前提・実現したいこと

PHPの連想配列を用い置換したいのですが
その際に、複数のキーに一つの値を入れ置換するやり方が知りたいです。

どう使いたいか

例として、下記に書かれている「元のソースコード」では放送局の数だけ要素を作る必要があるので
「イメージのソースコード」のように都道府県ごとに放送局を一つにまとめて都道府県名に置換したいです。

問題

配列で複数のキーに一つの値を入れ、それを連想配列に入れることはできたのですが
置換を行おうとするとエラーになります。
エラーになったコード内容とエラー内容は「試したたこと」に記載しました。

元のソースコード

<?php

$target = 'テレビ山梨, 新潟放送, 新潟テレビ21';

$replace = [
'山梨放送' => '山梨県',
'テレビ山梨' => '山梨県',
'新潟放送' => '新潟県',
'テレビ新潟' => '新潟県',
'新潟総合テレビ' => '新潟県',
'新潟テレビ21' => '新潟県',
];

echo str_replace(array_keys($replace), array_values($replace), $target);

// 結果 山梨県, 新潟県, 新潟県
?>

イメージのソースコード

<?php

$target = 'テレビ山梨, 新潟放送, 新潟テレビ21';

$yamanashi = ['山梨放送','テレビ山梨' ];
$niigata = ['新潟放送', 'テレビ新潟', '新潟総合テレビ', '新潟テレビ21' ];

$replace = [
    $yamanashi => '山梨県'
    $niigata => '新潟県'
    ];

echo str_replace(array_keys($replace), array_values($replace), $target);
?>

試したこと

エラーが出たソースコード

<?php

$target = 'テレビ山梨, 新潟放送, 新潟テレビ21';

$yamanashi = ['山梨放送','テレビ山梨' ];
$res = array_combine( $yamanashi, array_pad( [], count( $yamanashi ), '山梨県' ) );

$replace = [
    $res,
    '新潟放送' => '新潟県',
    'テレビ新潟' => '新潟県',
    '新潟総合テレビ' => '新潟県',
    '新潟テレビ21' => '新潟県',
    ];

echo str_replace(array_keys($replace), array_values($replace), $target);

?>
エラーメッセージ

PHP Notice:  Array to string conversion in /workspace/Main.php on line 16

編集前の内容

PHPの配列で複数のキーに一つの値を入れたい場合

PHPの配列で複数のキーに一つの値を入れ置換するやり方が知りたいです。

下記の「元ソースコード」を「イメージのソース」のように
複数のキーに一つの値を入れる際に1行ですませるようにしたいです。

元のソースコード

<?php


$replace = [
'山梨放送' => '山梨県',
'テレビ山梨' => '山梨県',
];

print_r($replace);

?>

イメージのソースコード

<?php

$yamanashi = ['山梨放送','テレビ山梨' ];

$replace = [
    $yamanashi => '山梨県'
    ];

print_r($replace);
?>
エラーメッセージ

PHP Warning:  Illegal offset type in /workspace/Main.php on line 6
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2020/01/18 17:25

    回答が付いた質問の編集は慎重に行ってください。質問文のコードについて回答にて指摘があった場合は「追記」し、元のコードを編集する場合も「直したこと」がわかるようにしてください。後から見た人から見て、現在の回答が「無いコードに対しての指摘」になり、意味がわからなくなります。

    キャンセル

  • ayala

    2020/01/18 18:19

    大変失礼いたしました。
    編集前の内容を追記いたしました。

    キャンセル

回答 4

+3

$yamanashi = ['山梨放送','テレビ山梨' ];
$res = array_combine( $yamanashi, array_pad( [], count( $yamanashi ), '山梨' ) );
var_export( $res );
// array (
//   '山梨放送' => '山梨',
//   'テレビ山梨' => '山梨',
// )

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/18 15:49

    ありがとうございます。
    array_combine を使うのですね。

    キャンセル

  • 2020/01/18 17:28

    https://teratail.com/questions/history-questions/235852
    現在の私の回答は質問改変前の回答です。今時点のほかの方の回答も(編集されない限り)同じく質問改変前の回答です。

    キャンセル

  • 2020/01/18 18:21

    大変失礼いたしました。
    編集前の内容を追記いたしました。

    キャンセル

checkベストアンサー

+2

こんなことかしら?

県がふえたなら加算すればいいじゃない( 警告がでるならば array_merge 等で結合しよう )

<?php
$yamanashi = ['山梨放送','テレビ山梨' ];
$niigata = ['新潟放送', 'テレビ新潟', '新潟総合テレビ', '新潟テレビ21' ];
$result = array_combine($yamanashi,array_fill(0, count($yamanashi),'山梨県'))
            +array_combine($niigata,array_fill(0, count($niigata),'新潟県'));
print_r($result);

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/18 16:45

    ありがとうございます!

    キャンセル

  • 2020/01/18 21:21

    ありがとうございます!
    このやり方で、置換することもできました。

    $target = 'テレビ山梨, 新潟放送, 新潟テレビ21';

    $yamanashi = ['山梨放送','テレビ山梨' ];
    $niigata = ['新潟放送', 'テレビ新潟', '新潟総合テレビ', '新潟テレビ21' ];
    $replace = array_combine($yamanashi,array_fill(0, count($yamanashi),'山梨県'))
    +array_combine($niigata,array_fill(0, count($niigata),'新潟県'));

    echo str_replace(array_keys($replace), array_values($replace), $target);

    // 出力結果 山梨県, 新潟県, 新潟県

    キャンセル

+1

配列を使って置換をしようと考えています。

str_replaceでしたら、置換先だけ文字列の指定を行うことができます(PHPリファレンス)。わざわざ連想配列を作らなくても大丈夫です。

$yamanashi = ['山梨放送','テレビ山梨' ];

$replaced = str_replace($yamanashi, '山梨県', $target);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/18 10:28 編集

    なることを意図していません。「もとのソースコード」より手前で迂回できるのではないか、という回答です。

    キャンセル

  • 2020/01/18 10:32

    あぁ、なるほど。理解しました。どういう意図での回答だったのか興味を持ったので確認してみました。
    確かにデータをどう使いたいかによってはこちらの回答で済む可能性もありますね。

    キャンセル

  • 2020/01/18 16:09

    意図を読んでみただき、ありがとうございます。
    説明不足ですいません。
    連想配列にしたのは、他にもキーと値を追記できるようするためです。
    例えば、山梨県以外の放送局も置換したい場合です。

    以下のコードですと、放送局の数だけ要素を作る必要があるので
    都道府県ごとに放送局を一つにまとめて都道府県名に置換
    をしたかったのです。

    $replace = [
    '山梨放送' => '山梨県',
    'テレビ山梨' => '山梨県',
    '新潟放送' => '新潟県',
    'テレビ新潟' => '新潟県',
    '新潟総合テレビ' => '新潟県',
    '新潟テレビ21' => '新潟県',
    ];

    echo str_replace(array_keys($replace), array_values($replace), $target);

    ただ、このやり方だと連想配列は置換できない?ようです。
    初学者なので見当外れなことを言っていたらすいません。

    キャンセル

+1

1行ですませる

「1行で」の定義をきちんと書かないと↓のようなコードが出てきても文句は言えません。

$yamanashi = ['山梨放送','テレビ山梨' ];$replace=[];$val="山梨県";foreach($yamanashi as $k){$replace[$k]=$val;}var_dump($replace);

エラーはそもそも配列のキーには使えない型(今回は配列)をあてはめようとしているからですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/18 16:14

    ありがとうございます。
    すいません、言葉足らずでした。
    放送局の数だけ要素を作る必要があるので、都道府県ごとに放送局を一つにまとめて都道府県名に置換したい。
    という答えで伝わりますかね。

    キャンセル

  • 2020/01/18 16:20

    質問を編集して追記してください。
    あと、別の回答でも挙がってますが「どう使いたいか」も要件として必要です。

    キャンセル

  • 2020/01/18 16:30

    ありがとうございます。
    只今、編集しています。

    キャンセル

  • 2020/01/18 18:21

    大変失礼いたしました。
    追記いたしました。

    キャンセル

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

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

関連した質問

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