我有一个数组,其值是特定格式的所有数组,如下所示:
Array
(
[0] => Array
(
[0] => '8227'
[1] => ' 8138'
)
[1] => Array
(
[0] => '8227'
[1] => ' 8138'
[2] => ' 7785'
)
)
我希望有这个:
Array
(
[0] => 8227
[1] => 8138
[2] => 7785
)
我该怎么做?
答案 0 :(得分:5)
$result = array();
foreach ($input as $sub) { // Loop outer array
foreach ($sub as $val) { // Loop inner arrays
$val = trim($val);
if (!in_array($val, $result)) { // Check for duplicates
$result[] = $val; // Add to result array
}
}
}
答案 1 :(得分:3)
$result = array();
foreach($array as $arr){
$result = array_merge($result, $arr);
}
$result = array_unique($result);
答案 2 :(得分:2)
array_merge_recursive()
可用于展平数组。然后,array_unique()
获取唯一值,并使用array_values()
“重新索引”结果数组。
$flat = call_user_func_array('array_merge_recursive', $subject);
$uniq = array_values(array_unique($flat));
答案 3 :(得分:0)
<?php
$array = array(
0 => array(
0 => 8227,
1 => 8138
),
1 => array(
0 => 8227,
1 => 8138,
2 => 7785
)
);
$newArray = array();
array_walk_recursive($array, function($item, $key) use(&$newArray) {
if(!in_array($item, $newArray)) {
$newArray[] = $item;
}
});
print_r($newArray);
?>
答案 4 :(得分:0)
我不喜欢in_array()
的迭代调用的想法,因为它会对大数组造成一些拖累。
现在,我要遵循的方法可能不会设置任何速度记录(我没有打扰基准),但我想我会发布一些非正统的方法,以防它们激发未来的读者。< / p>
方法#1:
array_flip()
array_keys()
重新索引结果数组(输出值为整数类型)方法#2:
array_flip()
array_keys()
重新索引结果数组(输出值为整数类型)代码:(Demo)
$array=[['8227','8138'],[' 8227',' 8138',' 7785']];
echo "regex method: ";
var_export(array_keys(array_flip(preg_split('/\D+/',json_encode($array),NULL,PREG_SPLIT_NO_EMPTY))));
echo "\n\nnon-regex method: ";
var_export(array_keys(array_flip(str_word_count(json_encode($array),1,'0..9'))));
输出:
regex method: array (
0 => 8227,
1 => 8138,
2 => 7785,
)
non-regex method: array (
0 => 8227,
1 => 8138,
2 => 7785,
)
如果这些方法中的任何一种表现良好,那将是因为它们不进行迭代函数调用。
P.S。好吧,因为我很好奇,我只是对我的两种方法和DaveRandom的方法进行了非常小/非官方的速度测试(使用OP的数据只进行了1000次迭代 - 我没有想要滥用3v4l.org)和......
同样,我将说明用于微优化的伪造测试可能毫无意义,如果它真的很重要,应该对你的REAL数据进行真正的测试。如果你只是喜欢这个页面上另一个答案的逻辑流程,我完全尊重它。