如何将2-dim字符串数组转换为1-dim修剪的唯一值数组?

时间:2011-09-12 11:30:07

标签: php arrays foreach unique

我有一个数组,其值是特定格式的所有数组,如下所示:

Array
(
    [0] => Array
        (
            [0] => '8227'
            [1] => ' 8138'
        )

    [1] => Array
        (
            [0] => '8227'
            [1] => ' 8138'
            [2] => ' 7785'
        )

)

我希望有这个:

Array
(
    [0] => 8227
    [1] => 8138
    [2] => 7785
)

我该怎么做?

5 个答案:

答案 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:

  • 将多维数组转换为json字符串
  • 在所有非数字子串上拆分字符串(这也会修剪值)
  • 使用array_flip()
  • 消除重复项
  • 使用array_keys()重新索引结果数组(输出值为整数类型)

方法#2:

  • 将多维数组转换为json字符串
  • 提取(在这种情况下包括数字,并且没有任何字母需要担心)
  • 使用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)和......

  • 方法#1的运行速度与方法#2一样快
  • 方法#1和方法#2的运行速度都比DaveRandom的方法快。

同样,我将说明用于微优化的伪造测试可能毫无意义,如果它真的很重要,应该对你的REAL数据进行真正的测试。如果你只是喜欢这个页面上另一个答案的逻辑流程,我完全尊重它。