Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Foreach для перебора подмассивов
 
 автор: Мышара   (10.12.2010 в 17:03)   письмо автору
 
 

Ребят, я совсем новичок в php, стараюсь во всем разобраться, но вот описание учебника не поняла.

У меня такая задача:

Есть массив Х, в нем произвольное количество подмассивов N (по разному выдается из базы) в каждом подмассиве две переменные: A и B. Нужно превратить каждый подмассив в строчку:

Количество (переменная А) для (переменная В)

Строк столько же сколько массивов, строчки вывести все. Я догнала, что надо писать foreach, но не поняла как.

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

Спасибо за участие!

  Ответить  
 
 автор: Trianon   (10.12.2010 в 17:08)   письмо автору
 
   для: Мышара   (10.12.2010 в 17:03)
 

пример массива привели бы:

//$arr = array( ........);
var_dump($arr);


а заодно и пример строк, которые нужно по нему получить.

  Ответить  
 
 автор: Мышара   (10.12.2010 в 17:14)   письмо автору
 
   для: Trianon   (10.12.2010 в 17:08)
 

Вот массив:

[ip] => Array
(
[0] => Array
(
[name] => 66.211.160.88
[count] => 39
[match] => 1
)

[1] => Array
(
[name] => 66.135.205.13
[count] => 39
[match] => 1
)

Вот строчка:

39 domains for ip 66.135.205.13

  Ответить  
 
 автор: Trianon   (10.12.2010 в 17:40)   письмо автору
 
   для: Мышара   (10.12.2010 в 17:14)
 

<?
  
foreach($adr_list as $adr)
    echo 
"--- " $adr['count']. " domains for "$adr['name']. " --<br/>";

  Ответить  
 
 автор: Мышара   (10.12.2010 в 17:56)   письмо автору
 
   для: Trianon   (10.12.2010 в 17:40)
 

А $adr_list - это что?

  Ответить  
 
 автор: Trianon   (10.12.2010 в 18:18)   письмо автору
 
   для: Мышара   (10.12.2010 в 17:56)
 

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

  Ответить  
 
 автор: sim5   (10.12.2010 в 17:43)   письмо автору
 
   для: Мышара   (10.12.2010 в 17:14)
 

<?
$arr 
= array('ip' => array(
  array(
'name' => '66.211.160.88''count' => 39'match' => 1),
  array(
'name' => '66.135.205.13''count' => 39'match' => 1))
);
echo 
"<pre>";
array_walk($arr['ip'], create_function('&$v','$v = $v["count"] . " domains for ip " . $v["name"];'));
print_r($arr);

  Ответить  
 
 автор: Мышара   (10.12.2010 в 17:56)   письмо автору
 
   для: sim5   (10.12.2010 в 17:43)
 

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

  Ответить  
 
 автор: sim5   (10.12.2010 в 18:05)   письмо автору
 
   для: Мышара   (10.12.2010 в 17:56)
 

Работайте, кто же вам запрещает. Вы говорите "превратить в строку" да пожайлуйста, делайте сразу вывод вместо присвоения. Разве дело в функциях?
Если они у вас постоянно разные, и разные это значит, что вы сами не знаете, что они из себя представляют, то тогда дело труба.

  Ответить  
 
 автор: Мышара   (10.12.2010 в 18:09)   письмо автору
 
   для: sim5   (10.12.2010 в 18:05)
 

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

  Ответить  
 
 автор: sim5   (10.12.2010 в 18:16)   письмо автору
 
   для: Мышара   (10.12.2010 в 18:09)
 

Мадам, выражайтесь конкретнее, что значит "этих подмассивов может быть 5, может быть 10"? Если это число вложенных массивов элемента ip, то хоть 1000, вышеизложенный код как и просто обход foreach их обработает, и если нужна проверка на пустоту, то тоже нет проблем. Но если "этих подмассивов может быть 5, может быть 10", это вы о глубине вложения (что не похоже по примеру), то тем более вам в руки функции подобные array_walk, которые позволяют обойти массив рекурсивно.

  Ответить  
 
 автор: Мышара   (10.12.2010 в 18:31)   письмо автору
 
   для: sim5   (10.12.2010 в 18:16)
 

Нет не глубина, а именно число вложенных массивов.

Как тут использовать array_walk, Я ни разу с ним дела не имела. Я сосбственно сумела только проверять массив на пустоту. Дальше затык.

П.С. Между прочим, мадемуазель ))))

  Ответить  
 
 автор: psychomc   (10.12.2010 в 18:36)   письмо автору
 
   для: Мышара   (10.12.2010 в 18:31)
 

>П.С. Между прочим, мадемуазель ))))

ну так отлично, значит проблема решится за секас ;)

  Ответить  
 
 автор: Мышара   (10.12.2010 в 18:45)   письмо автору
 
   для: psychomc   (10.12.2010 в 18:36)
 

Дистанционный в мозг пойдет? )

  Ответить  
 
 автор: psychomc   (10.12.2010 в 21:06)   письмо автору
 
   для: Мышара   (10.12.2010 в 18:45)
 

нененененене, его и так очень много)

  Ответить  
 
 автор: sim5   (10.12.2010 в 19:07)   письмо автору
 
   для: Мышара   (10.12.2010 в 18:31)
 

Как использовать array_walk... да по разному, как потребуется, хотя делать он может только одно, то есть вы можете вилкой есть, а можете использовать ее как миксер. ;-)
Вам лучше простой обход массива сделать, о чем уже писали ранее. Не знаю, что в вашем понимании пустой массив, но к примеру тут проверка ключа count, и если не пуст, то вывод:
<?
$arr 
= array('ip' => array(
  array(
'name' => '1111''count' => 11'match' => 1),
  array(
'name' => '2222''count' => 22'match' => 1),
  array(
'name' => '3333''count' => 33'match' => 1),
  array(
'name' => '4444''count' => 44'match' => 1),
  array(
'name' => '5555''count' => '''match' => 1),
  array(
'name' => '6666''count' => 55'match' => 1),
  array(
'name' => '7777''count' => '''match' => 1),
  array(
'name' => '8888''count' => 66'match' => 1),
  array(
'name' => '9999''count' => 77'match' => 1))
);

foreach(
$arr['ip'] as $key) if($key["count"]) echo $key["count"] . " domains for ip " $key["name"] . "<br>";
Можете добавить в массив еще записей для проверки, убедитесь сами, что влиять на работу это не будет, кроме как на время обработки.

  Ответить  
 
 автор: psychomc   (10.12.2010 в 17:12)   письмо автору
 
   для: Мышара   (10.12.2010 в 17:03)
 

судя по всему это
<?php
foreach ($x as $n) {
    foreach (
$n as $var) {
        echo 
$var["a"]." ".$var["b"];
    }
}

  Ответить  
 
 автор: Мышара   (10.12.2010 в 17:14)   письмо автору
 
   для: psychomc   (10.12.2010 в 17:12)
 

Спасибо огромное, сейчас попробую применить!

  Ответить  
 
 автор: Мышара   (10.12.2010 в 17:32)   письмо автору
 
   для: psychomc   (10.12.2010 в 17:12)
 

Я с вышенаписанным массивом сделала так:

<? foreach($data->overview->overview->data->{0}->ip as $ip) {
        foreach (
$ip as $var) {
            echo 
$var["count"]. " for ip " $var["name"] . "<br/>";
            } } 
?>  


Он работает, но берет какие-то интересные цифры непонятно откуда (

6 for ip 6
3 for ip 3
1 for ip 1

  Ответить  
 
 автор: Trianon   (10.12.2010 в 17:43)   письмо автору
 
   для: Мышара   (10.12.2010 в 17:32)
 

а вот эту портянку $data->overview->overview->data->{0}->ip вот прям так сразу в форич засовывать?
Может переменной сперва присвоить? var_dump поглядеть?
Уверен, что в ней Вы и напороли.

  Ответить  
 
 автор: Мышара   (10.12.2010 в 17:58)   письмо автору
 
   для: Trianon   (10.12.2010 в 17:43)
 

Это путь до массива, я что сделаю, если он такой матерый... там на принт_р этих массивов тысяча строк выпадает....

Как его к переменой присвоить?

И кстати эти вот смешные штуки:

6 for ip 6
3 for ip 3
1 for ip 1

путем наблюдения за массивом с целью понять: откудава? Выяснилось, что это первые цифры значений переменных в подмассивах. А почему не целиком и почему-то по три строки на массив а не по одной.

  Ответить  
 
 автор: Trianon   (10.12.2010 в 18:20)   письмо автору
 
   для: Мышара   (10.12.2010 в 17:58)
 

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


б) помимо этого, означает, что Вы вводите нас в заблуждение.

  Ответить  
 
 автор: Мышара   (10.12.2010 в 18:35)   письмо автору
 
   для: Trianon   (10.12.2010 в 18:20)
 

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

б) В чем бы? Что еще сказать? Я скажу без проблем, но вот этот кусок и эн массивов, в которые он вложен - это все, с чем я работаю (

  Ответить  
 
 автор: Trianon   (10.12.2010 в 18:55)   письмо автору
 
   для: Мышара   (10.12.2010 в 18:35)
 

вот этот фрагмент
<? foreach($data->overview->overview->data->{0}->ip as $ip) {
        foreach (
$ip as $var) {
            echo 
$var["count"]. " for ip " $var["name"] . "<br/>";
            } } 
?>  


...давайте разделим так:

<? 

   $list 
$data->overview->overview->data->{0}->ip;

     foreach(
$list as $ip) {
        foreach (
$ip as $var) {
            echo 
$var["count"]. " for ip " $var["name"] . "<br/>";
            } } 
?>  


так вот, очень неплохо было бы показать начало $list.
Например, так:
$start = array_slice($list, 0, 5);
var_dump($start);

  Ответить  
 
 автор: Мышара   (13.12.2010 в 13:42)   письмо автору
 
   для: Trianon   (10.12.2010 в 18:55)
 

Он ругался, что массивом данные вывести не может.

<? foreach($data->overview->overview->data->{0}->ip as $ip):?>

        <?= $ip->count;?> for ip <?= $ip->name?> <br/>
    <? endforeach; ?>    


Вот заработало!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования