Какие способы перебора массива в PHP (без foreach)?


Прежде чем я ругал за вопрос, предупреждение заранее, что целью же это просто любопытство уровень. Я знаю, что foreach - это средство больше подходит для этого.

Но я хотел бы знать следующее:

, Каковы способы перебора с array в PHP, без использования foreach, так что вы можете получить доступ к índice и valor (например, foreach)?

хотелось Бы увидеть примеры с for, while или даже функция.

дам array для модели ответ:

$array = array(
    'stack' => 'Overflow',
    'linguagem' => 'Português',
    'tags' => array('PHP', 'Iteração', 'Array')
);

Необходимо взаимодействие, не заметив таким образом (например, с foreach):

foreach($array as $indice => $valor)
{
   var_dump($indice, $valor);
}

Внимание: если не принимаются для итерации с помощью for $i++, способ engessada и служит только для array, числовые индексы.

Author: felipsmartins, 2015-08-19

12 answers

И также новичком, я был заинтересован в вопросе и нашел интересную статью о нем.

Вот решение, согласно статье.

$array = array(
    'stack' => 'Overflow',
    'linguagem' => 'Português',
    'tags' => array('PHP', 'Iteração', 'Array')
);

$keys = array_keys($array);

$size = count($array);

for ($i = 0; $i < $size; $i++) {
    $key   = $keys[$i];
    $value = $array[$key];

    echo $value;

}

Вот код работает в IDEONE

Ref: PHP internals: When does foreach copy?

 29
Author: lazyFox, 2015-08-19 15:57:51

Тоже можно перебирать массив с помощью функции array_walk() array_walk_recursive(), первый аргумент-это массив, который вы хотите итерации, во-вторых, это функции, которые должны быть применены на всех элементах, эта функция может быть уже объявлена или акционерного(clousere)

$array = array(
    'stack' => 'Overflow',
    'linguagem' => 'Português',
    'tags' => array('PHP', 'Iteração', 'Array')
);

array_walk($array, function($v, $k) { 
    var_dump($v, $k);
});

В случае, если array_walk_recursive, он iterará с элементами array рекурсивно.

См.:

array_walk_recursive($array, function ($value, $key) {
    var_dump($value, $key);
});

Результат:

string(8) "Overflow"
string(5) "stack"
string(10) "Português"
string(9) "linguagem"
string(3) "PHP"
int(0)
string(10) "Iteração"
int(1)
string(5) "Array"
int(2)

, Например в IDEONE

Пример ideone

 14
Author: rray, 2015-08-19 18:48:02

Я Не могла сдержать своих эмоций, без того, чтобы дать моей palinha здесь

Другой хороший способ сделать это итерации array, без foreach, было бы с while, обход на вершине экземпляр ArrayIterator.

См.:

 $it = new ArrayIterator($array);

 while ($it->valid()) {

    $indice = $it->key();

    $valor = $it->current();

    $it->next();
 }

Достаточно вспомнить, что, чтобы другой итерации, будет необходимо использовать метод rewind, чтобы вернуться в указатель на начало.

$it->rewind(); // Após o while
 13
Author: Wallace Maxters, 2018-03-14 19:22:12

Еще говорил объектов, мы могли бы также сделать так:

$array = array(
    'stack' => 'Overflow',
    'linguagem' => 'Português',
    'tags' => array('PHP', 'Iteração', 'Array')
);

$arrayobject = new ArrayObject($array);

$iterator = $arrayobject->getIterator();

while($iterator->valid()) {
    echo $iterator->key() . ' => ' . $iterator->current() . "\n";

    $iterator->next();
}

Важно помнить, что мы должны использовать метод next в while, чтобы перейти к следующему элементу и, таким образом, избежать бесконечный цикл.

, Который попадет в его собственный ответ, относящееся к ArrayIterator()

 12
Author: SneepS NinjA, 2017-04-13 12:59:42

Вы можете использовать array_walk:

$array = array(
    'stack' => 'Overflow',
    'linguagem' => 'Português',
    'tags' => array('PHP', 'Iteração', 'Array')
);

array_walk($array, function ($value, $key){
    var_dump($key, $value);
});

(Если индекс не имеет значения, array_map может быть использовано

$array = array(
    'stack' => 'Overflow',
    'linguagem' => 'Português',
    'tags' => array('PHP', 'Iteração', 'Array')
);

array_map(function($value)
{
    var_dump($value);
}, $array); 
 11
Author: gmsantos, 2015-08-19 17:53:45

Другой способ сделать это с помощью функции each.

Она хватает указателя текущей array и превращается в другой array, содержащих значение индекса и значение этого array. Затем он переходит к следующему элементу array.

;

each($array);

Результат:

Array
(
    [1] => Portugus
    [value] => Portugus
    [0] => linguagem
    [key] => linguagem
)

Увидите, что он возвращает ключ, называемый value и другой числовой показатель. Это чтобы можно было использовать эту функцию с помощью list.

, То мы можем сделать это:

while (list($key, $value) = each($array)) {
    var_dump($key, $value);
}

Мы все еще Можем использовать (как ни странно) for:

for (; list($key, $value) = each($array); ) {
      var_dump($key, $value);
}
 10
Author: Wallace Maxters, 2015-08-19 18:46:23

Вы можете построить design patterns взаимодействия, как показано ниже, который основан на PHP Iterator ( http://php.net/manual/pt_BR/class.iterator.php ):

 <?php

   //entrada de elementos
    $myCollection = [
        new stdClass(),
        new stdClass(),
        new stdClass(),
        new stdClass(),
    ];
     /**
     * :::: Iterator Interface 
     *
     * @author ivan-ferrer
     */
    interface MyIteratorInterface
    {
        public function current();
        public function rewind();
        public function next();
        public function key();
        public function valid();
    }

    // Estruturais, Comportamentais e Criacionais
    // PHP Iterator

    class PHPIterator implements Iterator, MyIteratorInterface
    {
        private $collection = [];
        private $key        = 0;

        public function __construct(array $collection = [])
        {
            $this->collection = $collection;
        }

        public function rewind()
        {
            $this->key = 0;
        }


        public function current()
        {
            return $this->collection[$this->key];
        }

        public function key()
        {
            return $this->key;
        }

        public function next()
        {
            ++$this->key;
        }


        public function valid()
        {
            return isset($this->collection[$this->key]);
        }
    }

    $phpIterator = new PHPIterator($myCollection);

    echo "-----------------while--------------------\n";
    $phpIterator->rewind();

    while ($phpIterator->valid()) {
        var_dump($phpIterator->current());
        $phpIterator->next();
    }

    echo "-------------------for--------------------\n";


    for ($phpIterator->rewind(); $phpIterator->valid(); $phpIterator->next()) {
        var_dump($phpIterator->current());
    }


    echo "------------------foreach-----------------\n";

    foreach ($phpIterator as $key => $object) {
        var_dump($object);
    }

Существует также несколько других способов сделать iterator: http://php.net/manual/pt_BR/spl.iterators.php

 9
Author: Ivan Ferrer, 2015-08-19 17:24:16

Можно рассматривать его как объект, так:

$array = array(
    'stack' => 'Overflow',
    'linguagem' => 'Português',
    'tags' => array('PHP', 'Iteração', 'Array')
);


$A = $array;
while(!is_null(key($A))) {
  var_dump(current($A));
  next($A);
}

Http://php.net/manual/pt_BR/language.oop5.iterations.php

 9
Author: SneepS NinjA, 2015-08-19 17:57:06

Действительно, цикл for не работает с arrays) индексы с не числовыми, но можно обойти это, если "сбросить" keys но если же не важны, array_values.

$array = array(
    'stack' => 'Overflow',
    'linguagem' => 'Português',
    'tags' => array('PHP', 'Iteração', 'Array')
);

$numericArray = array_values($array);

$count = count($numericArray);

for ($i = 0; $i < $count; $i++){
    var_dump($numericArray[$i]);
}
 7
Author: gmsantos, 2015-08-19 18:55:20

Ок, только грязные, будет мой ответ:

print_r( $array );

Это перебирает и уже показывает на экране только один раз, и столько же ключей, сколько значений.

И еще лучше, работает arrays) многоуровневые ;)



Ок, не имеет возможности воспользоваться услугами данных, чтобы много разных вещей, но если это только для отображения, print_r входит "полный пакет".

 7
Author: Bacco, 2018-08-11 13:23:26

Было сказано в предыдущий ответ , array_map игнорирует индекс.

Однако, существует еще одна очень интересная форма. С помощью array_map, нескольких параметров. Таким образом, мы можем передать массив с ключами, а другой для значения.

Таким образом:

$array = array('nome' => 'wallace', 'idade' => 25);

$map = function ($value, $key)
{
   echo "$key => $value";
}

array_map($map, $array, array_keys($array));

, Связанным: Какова цель array_map принимать бесконечные параметры типа массив, после обратного вызова?

 3
Author: Wallace Maxters, 2017-04-13 12:59:32

, Используя do ... while:

    do
    {
        $cliente = current($dados_teste); // acessa item atual com "current"
        $tabela.= $cliente['nome'] .'-'. $cliente['idade']; // usa os dados
    }            
    while(next($dados_teste)!==false); // avança o ponteiro com "next"

. пример Кода:

<?php

    $dados_teste = array(
                            array(
                                    'nome'=>'Pedro',
                                    'idade'=>'45',
                                    'uf'=>'RJ'
                                ),

                            array(
                                    'nome'=>'Maria',
                                    'idade'=>'30',
                                    'uf'=>'RJ'
                                ),    

                            array(
                                    'nome'=>'Miguel',
                                    'idade'=>'28',
                                    'uf'=>'MG'
                                ),    

                            array(
                                    'nome'=>'Paulo',
                                    'idade'=>'52',
                                    'uf'=>'SP'
                                ),                            
                        );


    $tabela = '<table>
        <tr><th>Nome</th><th>Idade</th><th>UF</th></tr>';

    do
    {
        $cliente = current($dados_teste);

        $tabela.= '
        <tr><td>'.$cliente['nome'] .'</td><td>'. $cliente['idade'] .'</td><td>'.  $cliente['uf'] .'</td></tr>';
    }            
    while(next($dados_teste)!==false);    

    $tabela.='
    </table>';   

?><!DOCTYPE HTML>
<html>
<head>
    <title>Exemplo Iterando array com Do...While</title>
    <style>
        table {border-collapse: collapse; }
        th,td { border:1px solid #777; padding:10px; }
    </style>
</head>
<body>
    <?php echo $tabela; ?>

</body>
</html>

Output:

    <!DOCTYPE HTML>
    <html>
    <head>
        <title>Exemplo Iterando array com Do...While</title>
        <style>
            table {border-collapse: collapse; }
            th,td { border:1px solid #777; padding:10px; }
        </style>
    </head>
    <body>
        <table>
            <tr><th>Nome</th><th>Idade</th><th>UF</th></tr>
            <tr><td>Pedro</td><td>45</td><td>RJ</td></tr>
            <tr><td>Maria</td><td>30</td><td>RJ</td></tr>
            <tr><td>Miguel</td><td>28</td><td>MG</td></tr>
            <tr><td>Paulo</td><td>52</td><td>SP</td></tr>
        </table>
    </body>
    </html>
 2
Author: Antonio Alexandre, 2018-08-11 13:08:19