Какие способы перебора массива в 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
, числовые индексы.
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
Тоже можно перебирать массив с помощью функции 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
Я Не могла сдержать своих эмоций, без того, чтобы дать моей 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
Еще говорил объектов, мы могли бы также сделать так:
$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()
Вы можете использовать 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);
Другой способ сделать это с помощью функции 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);
}
Вы можете построить 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
Можно рассматривать его как объект, так:
$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);
}
Действительно, цикл 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]);
}
Ок, только грязные, будет мой ответ:
print_r( $array );
Это перебирает и уже показывает на экране только один раз, и столько же ключей, сколько значений.
И еще лучше, работает arrays) многоуровневые ;)
Ок, не имеет возможности воспользоваться услугами данных, чтобы много разных вещей, но если это только для отображения, print_r
входит "полный пакет".
Было сказано в предыдущий ответ , 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 принимать бесконечные параметры типа массив, после обратного вызова?
, Используя 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>