PHP Modify Array - PullRequest
       6

PHP Modify Array

1 голос
/ 02 января 2011

У меня есть следующий массив:

array(a, a, a, b, b, c, c, c, c, d, d);

Когда я перебираю его и повторяю его, получается:

a
a
a
b
b
c
c
c
c
d
d

Как бы я ни захотел повторить его в таком видеспособ отображения:

a
b
c
d
a
b
c
d
a
c
c

Вот массив в сетке, чтобы лучше объяснить, что я пытаюсь достичь

Current
a a a b
b c c c
c d d

What im tryin to do
a b c d
a b c d
a c c

Как мне это сделать?

Видя некоторые из ваших ответов, ясно, что я не объяснил это достаточно хорошо: /

Я должен был включить, как должны выглядеть ключи массива:

0a 1a 2a 3b
4b 5c 6c 7c
8c 9d 10d

0a 3b 6c 9d
1a 4b 7c 10d
2a 5c 8c

Воткак мне нужно организовать массивы, по ключу

0a 
1a 
2a 
3b
4b 
5c 
6c 
7c
8c 
9d 
10d

0a 
3b 
6c 
9d
1a 
4b 
7c 
10d
2a 
5c 
8c

Ответы [ 4 ]

1 голос
/ 02 января 2011

Другой способ (предполагается, что массив уже отсортирован, как в вашем примере):

$vals = array_count_values($array);
while (!empty($vals)) {
    foreach ($vals as $key => & $ct) {
        echo $key . "\n";
        if (!--$ct) {
            unset($vals[$key]);
        }
    }
}
1 голос
/ 02 января 2011

Перебрать массив следующим образом:

Пример:

function noRepeatArray($array){
    $lastChar = "";
    for($j = 0;$j < count($array);$j++){
        for($i = 0;$i < count($array);$i++){
            if($array[$i] != $lastChar && strlen($array[$i]) > 0){
                echo $array[$i] ."<br />";
                $lastChar = $array[$i];
                $array[$i] = '';
            }
        }
        $lastChar = "";
    }
}

Это будет циклически проходить по массиву и не позволит повторять символ, если только он не является единственным оставленным символом (в вашем примере, "c").

1 голос
/ 02 января 2011

Если я правильно понял вашу спецификацию, это должно сработать:

<code><?php

function magicFunction($input) {
    $output = array();

    sort($input);

    $startingCount = count($input);

    for ($j=0; $j<count($input); $j++) {
        $lastValue = NULL;

        for ($i=0; $i<count($input); $i++) {
            //var_dump($input[$i]);
            if ($input[$i] !== NULL && $input[$i] !== $lastValue) {

                $output[] = $input[$i];
                $lastValue = $input[$i];
                $input[$i] = NULL;
            }
        }
        //echo '<hr />';
        if (count($output) == $startingCount) {
            break;
        }
    }

    return $output;
}

$array = array('z','a','a','a','b','b','c','c','c','c','d','d','z');

$result = magicFunction($array);
echo '<pre>' . print_r($result, true) . '
'; ?>

дает вывод:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => z
    [5] => a
    [6] => b
    [7] => c
    [8] => d
    [9] => z
    [10] => a
    [11] => c
    [12] => c
)

Я добавил z во входной массив (дважды), чтобы мне было легче тестировать.

Вы можете раскомментировать закомментированные строки, чтобы увидеть, как работает моя функция.

Вероятно, есть более эффективный способ сделать это (или, по крайней мере, незначительные изменения производительности в этом методе), но я не собираюсь смотреть на это слишком сильно прямо сейчас, потому что я мог неправильно истолковать ваш вопрос. В любом случае, это не должно иметь значения, если ваш входной массив не очень большой.

1 голос
/ 02 января 2011

Вы можете использовать что-то вроде этого, чтобы вращать массив вокруг определенного шага / ширины:

function rotate_array(&$array, $width) {
    $newarr = array();

    for ($stride = 0; $stride < $width; $stride++) {
        for ($i = $stride; $i < count($array); $i += $width) {
            $newarr[] = $array[$i];
        }
    }

    return $newarr;
}

Этот тестовый скрипт:

$arr = array('a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'c', 'd', 'd');

print_r($arr);
print_r(rotate_array($arr, 3));

Будет выводить это:

Array
(
    [0] => a
    [1] => a
    [2] => a
    [3] => b
    [4] => b
    [5] => c
    [6] => c
    [7] => c
    [8] => c
    [9] => d
    [10] => d
)
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => a
    [5] => b
    [6] => c
    [7] => d
    [8] => a
    [9] => c
    [10] => c
)

Что выглядит как вывод, который вы хотели. Но из вашего вопроса неясно, как вы хотите получить этот результат. Мне кажется, что вы хотите отобразить каждый третий элемент, начиная с первого, затем каждый третий элемент, начиная со второго, и так далее. Если это не то, чего вы пытаетесь достичь, предоставьте лучшие образцы данных, чтобы ваша цель была яснее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...