我有以下数组:
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
)
唯一值不需要排序,键可以保留或不保留,第一个数组的合法值范围从 0
到 23
,而第二个数组的合法值1
到 7
。但是,除了这些值之外,还可以有其他值(0
23
,1
7
甚至未分隔的杂散字符串或其他超出我控制的数据类型(,我肯定想扔掉这些值。
您正在寻找的灵丹妙药是 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 ) );
你可以在这里看到它的实际效果。
使用 PHP <5.3,您必须提前声明函数:
function my_reducer( $memo, $item ) {
list( $l, $r ) = // ...
// ... as above ...
}
list( $left, $right ) = array_reduce(
$input, 'my_reducer',
array( array(), array() )
);
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));
?>
这是您的解决方案,请尝试实现以下代码。
应该为你工作。
$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>";
我所知,在这种情况下没有合适的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()
来获取独特的项目。
尝试:
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);
好的,如果"唯一值不需要排序,键可能会保留或不保留",那么我将把这些值作为键和值应用于结果数组,以确保唯一性,在初始循环后不再调用任何函数。
您可以使用explode()
或sscanf()
。 explode()
具有更简单的语法,只需要 glue 子字符串,而sscanf()
必须解析整个字符串,因此需要更复杂的模式来匹配。
如果您不需要唯一性,您可以简单地使用:
$hours = [];
$days = [];
foreach ($array as $item) {
sscanf($item, '%d-%d', $hours[], $days[]);
}
或
$hours = [];
$days = [];
foreach ($array as $item) {
[$hours[], $days[]] = explode('-', $item);
}
为了确保唯一性,只需将隔离的值也用作键。
sscanf()
允许您将解析的值直接转换为整数(演示(
$hours = [];
$days = [];
foreach ($array as $item) {
[0 => $hour, 1 => $day, 0 => $hours[$hour], 1 => $days[$day]] = sscanf($item, '%d-%d');
}
explode()
只会生成字符串类型的值。(演示(
$hours = [];
$days = [];
foreach ($array as $item) {
[0 => $hour, 1 => $day, 0 => $hours[$hour], 1 => $days[$day]] = explode('-', $item);
}
上述所有代码片段都依赖于"数组解构"语法,而不是调用list()
。 如果您想知道为什么在解构时重复键,请参阅这篇文章。