【问题标题】:I am working with PHP and have an Array that looks something like this :我正在使用 PHP,并且有一个看起来像这样的数组:
【发布时间】:2014-04-08 07:56:13
【问题描述】:
Array
(
    [0] =>  class_name:10:date:2014-03-08:start_time:10:15:finish_time:12:15:subject:Maths:exam_details:Extra comments:
    [1] =>  class_name:10:date:2014-03-07:start_time:10:15:finish_time:12:15:subject:Eng:exam_details:Extra comments:
    [2] =>  class_name:10:date:2014-03-06:start_time:10:15:finish_time:12:15:subject:Science:exam_details:Extra comments:
    [3] =>  class_name:10:date:2014-03-06:start_time:10:15:finish_time:12:15:subject:Science:exam_details:Extra comments:
    [4] =>  class_name:10:date:2014-03-06:start_time:10:15:finish_time:12:15:subject:Science:exam_details:Extra comments:
    [5] =>  class_name:10:date:2014-03-06:start_time:10:15:finish_time:12:15:subject:Science:exam_details:Extra comments:
)

如您所见,数组中有一些 start_time 和 finish_time 我想使用带分隔符“:”的爆炸函数来划分元素,但也可以展开 start_time 和完成时间的划分值。是否可以使用相同的分隔符来展开值

【问题讨论】:

标签: php arrays multidimensional-array foreach array-merge


【解决方案1】:

这是您正在寻找的原始草图:

<?php

$input = array (
  0 =>  'class_name:10:date:2014-03-08:start_time:10:15:finish_time:12:15:subject:Maths:exam_details:Extra comments:',
  1 =>  'class_name:10:date:2014-03-07:start_time:10:15:finish_time:12:15:subject:Eng:exam_details:Extra comments:',
  2 =>  'class_name:10:date:2014-03-06:start_time:10:15:finish_time:12:15:subject:Science:exam_details:Extra comments:',
  3 =>  'class_name:10:date:2014-03-06:start_time:10:15:finish_time:12:15:subject:Science:exam_details:Extra comments:',
  4 =>  'class_name:10:date:2014-03-06:start_time:10:15:finish_time:12:15:subject:Science:exam_details:Extra comments:',
  5 =>  'class_name:10:date:2014-03-06:start_time:10:15:finish_time:12:15:subject:Science:exam_details:Extra comments:'
);

$tokens = array();
foreach ($input as $key=>$line) {
  echo sprintf("line %s:\n", $key);
  preg_match('/class_name:([0-9]+):date:([0-9]{4}-[0-9]{2}-[0-9]{2}):start_time:([0-9]{2}:[0-9]{2}):finish_time:([0-9]{2}:[0-9]{2}):subject:([^:]+)/',
             $line , $tokens);
  var_dump($tokens);
  echo "\n\n";
};

?>

可能regular expression 必须根据数组的实际内容进行调整。它目前不捕获当前每行末尾的标记,因为您的问题中的语法不清楚。但是你应该得到基本的想法。

这个的输出是(缩短的):

line 0:
array(6) {
  [0] =>
  string(78) "class_name:10:date:2014-03 08:start_time:10:15:finish_time:12:15:subject:Maths"
  [1] =>
  string(2) "10"
  [2] =>
  string(10) "2014-03-08"
  [3] =>
  string(5) "10:15"
  [4] =>
  string(5) "12:15"
  [5] =>
  string(5) "Maths"
}


line 1:
array(6) {
  [0] =>
  string(76) "class_name:10:date:2014-03-07:start_time:10:15:finish_time:12:15:subject:Eng"
  [1] =>
  string(2) "10"
  [2] =>
  string(10) "2014-03-07"
  [3] =>
  string(5) "10:15"
  [4] =>
  string(5) "12:15"
  [5] =>
  string(3) "Eng"
}


[...]

当前为 php 的 cli 使用呈现输出,这使得开发这些东西更容易。如果您想在浏览器中对其进行测试,则必须将\n 换行符替换为&lt;br&gt; 标记等。

【讨论】:

  • 没那么重要,但不要忘记将$tokens 声明为数组。如果在 preg_match 之前没有声明,PHP 4 不会让我继续:P
  • @briosheje 没有声明 $token 是对的,尽管 PHP 实际上不需要这样做。我在 PHP 中没有看到任何阻止执行的功能。你得到的最多是一个警告,虽然我真的不明白为什么......你能指定错误消息吗?
  • @arkascha: "undefined variable: $tokens" ;) 无论如何,它确实发生在几个 PHP 版本中,从上面的 4.2.1 开始,据我所见,它实际上被认为是“注意”错误,有时甚至会被抑制:)
  • @briosheje 好的,但这是一个警告,而不是错误,所以它确实不会让你从“继续”。但是我同意声明变量更干净,所以我根据它调整了代码。谢谢!
  • @arkascha:它实际上作为我的 PHP 4.1.something 的错误弹出:P。无论如何,这只是为了指出以防有人(最终是您)可能遇到该问题;这并不是要抱怨上面的代码:)
【解决方案2】:

在你的情况下没有神奇的方法。

你必须自己去。

这是你可以做什么的想法

$keys = array('class_name','date','start_time','finish_time','subject','exam_details');

// for each line of your table
$parseData = retreiveData($keys, $stringData);

function retreiveData($keys, $stringData)
{   
    $results = array();
    $returnValue = preg_split('/('.implode('|', $keys).')/', $stringData, -1);
    for ($i =0; $i<count($results); $i++) {
        $results[$i] = rtrim(ltrim($returnValue[$i],':'),':');
    }
    return $results;
}

【讨论】:

    【解决方案3】:

    实际数组:

    $data =Array
    (
        0 =>  'class_name:10:date:2014-03-08:start_time:10:15:finish_time:12:15:subject:Maths:exam_details:Extra comments:',
        1 =>  'class_name:10:date:2014-03-07:start_time:10:15:finish_time:12:15:subject:Eng:exam_details:Extra comments:',
        2 =>  'class_name:10:date:2014-03-06:start_time:10:15:finish_time:12:15:subject:Science:exam_details:Extra comments:',
        3 =>  'class_name:10:date:2014-03-06:start_time:10:15:finish_time:12:15:subject:Science:exam_details:Extra comments:',
        4 =>  'class_name:10:date:2014-03-06:start_time:10:15:finish_time:12:15:subject:Science:exam_details:Extra comments:',
        5 =>  'class_name:10:date:2014-03-06:start_time:10:15:finish_time:12:15:subject:Science:exam_details:Extra comments:'
    );
    

    // 使用for每个循环迭代数组

    foreach($data as $dt=>$val){
    use explode function and create an array
    
    $datas= explode(':',$val);
    

    // 根据需要创建数组

    $new_array[] = array($datas[0],$datas[1],$datas[2].':'.$datas[3],$datas[4].':'.$datas[5].':'.$datas[6],$datas[7].':'.$datas[8].':'.$datas[9],$datas[10],$datas[11],$datas[12],$datas[13]);
    

    echo "<pre>";
    print_r($new_array);
    

    会给你想要的结果

    【讨论】:

      猜你喜欢
      • 2014-05-11
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 2023-03-03
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多