PHP使用字符串替换从多维数组中的键值替换关键字

Posted

技术标签:

【中文标题】PHP使用字符串替换从多维数组中的键值替换关键字【英文标题】:PHP Replace keyword from key-value in multidimension array using string_replace 【发布时间】:2014-10-07 00:11:09 【问题描述】:

我有一个这样的多维数组

Array
(

    [0] => Array
        (
            [0] => Foo
            [1] => Bar
            [2] => I like foobar
            [3] => 09/09/2014
        )

    [1] => Array
        (
            [0] => Foo2
            [1] => Bar2
            [2] => Very much
            [3] => 10/09/2014
        )
)

keys 数组看起来像这样

Array
    (
        [0] => From
        [1] => To
        [2] => Text
        [3] => Schedule Date
    )

消息是一个字符串变量

$message = "Hi To message is from From come get Text.

我的问题是如何同时替换所有数组值的$key 之间的关键字,以生成一个新的$messages 数组,其中包含替换关键字的消息?

这必须动态完成,而不是硬编码,因为每次都会使用不同的值。

【问题讨论】:

数组之间有关系吗?第一个数组中的第 0 个元素是否总是 from 我 array_slice() 第一个数组,这样我得到 2 个数组,一个用于关键字,另一个用于我要替换的值。本质上,关键字数组是数组 [0]。这有帮助吗? 【参考方案1】:

这里有一些注释代码供您参考。只要键的数量与输入数组中的元素数量匹配,这应该对您有用。这还假设您的占位符与您的键名匹配。

//input data    
$inputs = array();

$inputs[0][] = 'Foo';
$inputs[0][] = 'Bar';
$inputs[0][] = 'I like foobar';
$inputs[0][] = '09/09/2014';

$inputs[1][] = 'Foo2';
$inputs[1][] = 'Bar2';
$inputs[1][] = 'Very much';
$inputs[1][] = '10/09/2014';

//keys for the input data
$keys = array('From', 'To', 'Text', 'Schedule Date');

//message template
$message = "Hi To message is from From come get Text.";

$messages = array();

//Loop through the input data
foreach($inputs as $input) 
   $input = array_combine($keys, $input); //give input array our custom keys

   $userMessage = $message; //create a copy of the message template

   //Loop through the values replacing `$key` with $value
   foreach($input as $key=>$value)  
       $userMessage = str_replace(''.$key.'', $value, $userMessage);
   

   //Do something with the message
   $messages[] = $userMessage;



print_r($messages);

//Outputs:
//Array
//(
//    [0] => Hi Bar message is from Foo come get I like foobar.
//    [1] => Hi Bar2 message is from Foo2 come get Very much.
//)

在线演示here.

【讨论】:

【参考方案2】:

来自php.net:mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

所以假设你有:

Array1 (original): $arr1
Array2 (replace): $arr2

你可以这样做:

foreach($arr2 as $key => $value) 

    $newMessage = str_replace ($arr1[$key], $value, $message, 1 );

【讨论】:

【参考方案3】:

最好的办法是让第一个数组采用这种格式:

Array
(
    [0] => Array
    (
        ['From'] => 'Foo',
        ['To'] => 'Bar',
        ['Text'] => 'Message text',
        ['Schedule_Date'] => '01/01/01',
    ),
    ...
)

然后你可以循环执行:

$message = "Hi To message is from From come get Text.";
foreach ($array as $toSend) 
    $messageReplaced = $message;
    foreach ($toSend as $key => $value) 
        $messageReplaced = str_replace('' . $key . '', $value, $messageReplaced);
    
    $this->mail->send($messageReplaced, $toSend['Schedule_Date']); // just an example

【讨论】:

谢谢,您的回答类似于@cOle2。帮助很大 @zinyando 这是一个很好的庄园,通过单击答案左侧的 tick 图标来接受您使用过的答案(这对您有帮助) . upvote 其他好的答案或 downvote 完全不好的答案(在您收到至少 250 exp 之后)也是很好的庄园 - 通过点击 up/答案左侧的向下箭头图标。【参考方案4】:

假设您的标题数组是 $titles,如果您模板中的占位符与标题相同(例如 From 而不是 From),那么您可以轻松地进行替换

foreach($data as $row) 
    $result = str_replace($titles, $row, $template);
    // now do something with $result

既然这样很方便,而且占位符几乎和标题一样,所以先把标题转换成占位符再做上面的操作是很有诱惑力的:

$titles = ['From', 'To', 'Text'];
$placeholders = array_map(function($t)  return ''.$t.''; , $titles);
foreach($data as $row) 
    $result = str_replace($placeholders, $row, $template);
    // now do something with $result

【讨论】:

以上是关于PHP使用字符串替换从多维数组中的键值替换关键字的主要内容,如果未能解决你的问题,请参考以下文章

过滤数组对象中的键值,将将键值替换成我们需要的键名及值名

php实用小技巧持续更新

php如何判断多维数组中是不是存在字符串

如何在键具有数组的多维数组中求和所有相同的键值?

php 多维数组元素值替换【高手进来】

如何在胶合时分离(带有空格)字符串,使用数组中的键来检查它是否粘合?