【问题标题】:explode an array of delimited strings into two arrays将分隔字符串数组分解为两个数组
【发布时间】:2012-05-23 05:52:15
【问题描述】:

我有以下数组:

Array
    (
        [0] => 10-7
        [1] => 11-3
        [2] => 11-7
        [3] => 12-3
        [4] => 12-7
        [5] => 13-3
        [6] => 13-7
        [7] => 14-3
        [8] => 14-7
        [9] => 15-7
    )

我需要使用"-" 作为分隔符分割成两个数组:

Array
    (
        [0] => 10
        [1] => 11
        [2] => 11
        [3] => 12
        [4] => 12
        [5] => 13
        [6] => 13
        [7] => 14
        [8] => 14
        [9] => 15
    )

Array
    (
        [0] => 7
        [1] => 3
        [2] => 7
        [3] => 3
        [4] => 7
        [5] => 3
        [6] => 7
        [7] => 3
        [8] => 7
        [9] => 7
    )

有没有像array_explode 这样的东西可以满足我的需求?还是 php array 函数的组合?如果可能的话,我想在不通过我自己的for/each 循环的情况下执行此操作,或者至少在已经存在(伪)内置的东西时尽量减少重新发明轮子。我已经用 for 循环做到了。但我无法摆脱这样一种感觉,即有一种更优雅的方式可以巧妙地使用数组函数或类似的任何东西。非常感谢,伙计们。

附加信息:

不确定它是否重要,但我实际上是在生成的两个数组中的唯一值之后:

Array
    (
        [0] => 10
        [1] => 11
        [2] => 12
        [3] => 13
        [4] => 14
        [5] => 15
    )

Array
    (
        [0] => 7
        [1] => 3
    )

唯一值不需要排序,key可以保留也可以不保留,第一个数组的合法值范围是023,第二个数组的合法值是1到@ 987654334@。但是,可能有除这些之外的值(02317,甚至是未定界的杂散字符串或其他我无法控制的数据类型),我肯定想扔掉。

【问题讨论】:

  • 你试过什么???告诉我们
  • 哦,是的,我已经用 for 循环做到了。但我无法摆脱一种更优雅的方式巧妙地使用数组函数的感觉。
  • @AnaBan 将该信息添加到问题中,以便没有人回答错误的问题。
  • @Ikke 完成。 (添加更多信息)

标签: php arrays function explode


【解决方案1】:

您正在寻找的灵丹妙药是array_reduce(),例如(PHP 5.3+):

list( $left, $right ) = array_reduce( $input,
  function( $memo, $item ) {
    list( $l, $r ) = explode( '-', $item );
    $memo[0][$l] = $memo[1][$r] = true;
    return $memo;
  },
  array( array(), array() )
);

var_dump( array_keys( $left ), array_keys( $right ) );

你可以see it in action here

使用 PHP

function my_reducer( $memo, $item ) {
  list( $l, $r ) = // ...
  // ... as above ...
}

list( $left, $right ) = array_reduce(
  $input, 'my_reducer',
  array( array(), array() )
);

【讨论】:

  • 很高兴它很有用。 PHP 的函数式数组函数(array_reducearray_maparray_filter 等)是 PHP 最有用和最不充分利用的函数之一。
【解决方案2】:

http://codepad.org/TpVUIhM7

<?php
    $array = array('7-10','7-11','5-10');
    foreach($array as $a){list($x[], $y[]) = explode("-", $a);}
    print_r(array_unique($x));
    print_r(array_unique($y));
?>

【讨论】:

  • 谢谢,Andrius,也将尝试在这方面工作。我会看看我是否可以将它与@Ikke 的答案混合在一起......
  • Teeeheee,我的代码最少:P 我赢了! :D jk;祝你好运,很高兴我们帮助了你:)
【解决方案3】:

这是您的解决方案,尝试实现以下代码。

应该适合你。

$main_array =   array( 
        '0' => '10-7',
        '1' => '11-3',
        '2' => '11-7',
        '3' => '12-3',
        '4' => '12-7',
        '5' => '13-3',
        '6' => '13-7',
        '7' => '14-3',
        '8' => '14-7',
        '9' => '15-7',
        );

foreach($main_array as $key=>$value)
{
    $arr_value      =   explode('-',$value);
    $arr_temp1[]    =   $arr_value[0];
    $arr_temp2[]    =   $arr_value[1];  
}
$arr_temp1_unique   = array_unique($arr_temp1);
$arr_temp2_unique   = array_unique($arr_temp2);


print "<pre>";
print_r($main_array);
print_r($arr_temp1);
print_r($arr_temp2);

print_r($arr_temp1_unique);
print_r($arr_temp2_unique);
print "</pre>";

【讨论】:

    【解决方案4】:

    据我所知,在这种情况下没有合适的 PHP 函数可以使用。

    array_walk()array_map() 等函数生成单个数组,而不是多个数组。

    您说您已经尝试过使用循环的解决方案,但为了帮助您,我将如何解决这个问题:

    //$data contains the array you want to split
    $firstItems = array();
    $secondItems = array();
    
    foreach($data as $item)
    {
        list($first, $second) = explode('-', $item, 2);
        $firstItems[$first] = true;
        $secondItems[$second] = true;    
    }
    
    //Now you can get the items with array_keys($firstItems) and array_keys($secondItems);
    

    我通过设置键而不是值将 PHP 数组视为set。这使得您不必使用array_unique() 来获取独特的物品。

    【讨论】:

      【解决方案5】:

      试试:

      foreach($old_array as $array){
          $new_2d_array = explode('-', $array);
          $new_array_1[] = $new_2d_array[0];
          $new_array_2[] = $new_2d_array[1];  
      }
      $new_array_1 = array_unique($new_array_1);
      $new_array_2 = array_unique($new_array_2);
      

      【讨论】:

      • 谢谢,维沙尔。非常类似于我的 for 循环和 @pinaldesai 的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 2021-05-12
      • 1970-01-01
      相关资源
      最近更新 更多