Как преобразовать 2-мерный массив строк в 1-мерный массив усеченных уникальных значений? - PullRequest
0 голосов
/ 12 сентября 2011

У меня есть массив, все значения которого являются массивами определенного формата, который выглядит следующим образом:

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

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

)

, и я хотел бы иметь это:

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

Как я могусделать это?

Ответы [ 5 ]

5 голосов
/ 12 сентября 2011
$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
    }
  }
}
3 голосов
/ 12 сентября 2011
$result = array();
foreach($array as $arr){
    $result = array_merge($result, $arr);
}

$result = array_unique($result);
2 голосов
/ 12 сентября 2011

array_merge_recursive() может использоваться для выравнивания массива. Затем array_unique() для получения уникальных значений, с array_values() для «переиндексации» результирующего массива.

$flat = call_user_func_array('array_merge_recursive', $subject);
$uniq = array_values(array_unique($flat));
0 голосов
/ 05 января 2018

Мне не нравится идея повторных вызовов in_array(), поскольку она может немного перетаскивать большие массивы.

Теперь мои методы, вероятно, не будут устанавливать какие-либо рекорды скорости(Я не удосужился протестировать), но я подумал, что опубликую пару неортодоксальных подходов на случай, если они могут вдохновить будущих читателей.

Метод № 1:

  • преобразоватьмногомерный массив в строку json
  • разбить строку на все нецифровые подстроки (это также обрезает значения)
  • удалить дубликаты с помощью array_flip()
  • переиндексироватьрезультирующий массив с использованием array_keys() (выходные значения целочисленного типа)

Метод № 2:

  • преобразование многомерного массива в строку json
  • извлечение слов (которые в данном случае включают цифры, и не нужно беспокоиться о каких-либо буквах)
  • исключение дубликатов с помощью array_flip()
  • переиндексация полученного результатамассив с использованием array_keys() (выходные значения целочисленного типа)

Код: ( Демонстрация )

$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,
)

Если любой из этих методов работает хорошо, он будетпотому что они не делают повторные вызовы функций.

ps Хорошо, потому что мне было любопытно, я только что провел очень маленький / неофициальный тест скорости на моих двух методах и методе DaveRandom (только 1000 итераций с использованием данных OP - я не хотел злоупотреблять 3v4l.org) и ...

  • Метод № 1 работал примерно так же быстро, как метод № 2
  • И метод № 1, и метод № 2 работали быстрее, чем метод DaveRandom.

Опять же, я утверждаю, что сфабрикованные тесты для микрооптимизации могут быть бессмысленными, и необходимо проводить реальные тесты на ваших РЕАЛЬНЫХ данных, ЕСЛИ это действительно важно.Если вы просто предпочитаете логический поток другого ответа на этой странице, я полностью уважаю это.

0 голосов
/ 12 сентября 2011
<?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);
?>    
...