X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> вопро для Php-гуру, извлеченеие значений из многомерного массива
webpavilion
webpavilion
Topic Starter сообщение 12.9.2009, 21:39; Ответить: webpavilion
Сообщение #1


не могу справится с вот такой задачкой:

Имеем массив вида:
Array
(
    [0] => Array
        (
            [L] => 2
            [M] => a
        )

    [1] => Array
        (
            [L] => 1
            [M] => b
        )

    [2] => Array
        (
            [L] => 0
            [M] => c
        )

)

как без использования циклов (в любом виде) проверить соответствует ли значение переменной $х значению ключа M


--------------------
Не ведитесь, cамопис это почти всегда плохо!

Делаю сайты на Drupal 7.x
(очень дорого)
2
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Zellegius
Zellegius
сообщение 12.9.2009, 22:16; Ответить: Zellegius
Сообщение #2


может ввести новую переменную и присвоить ей значение ключа М?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
webpavilion
webpavilion
Topic Starter сообщение 12.9.2009, 22:24; Ответить: webpavilion
Сообщение #3


(Zellegius @ 12.9.2009, 22:16) *
может ввести новую переменную и присвоить ей значение ключа М?


думаю не прокатит реальный массив из задачи на 100 верхних ключей а в M md5
как вы переберете массив без цикла?

с циклом все просто:
    foreach ($array as $variable) {
        if ($variable['M'] == $x) echo 'все лабы автоматом';
    }


Сообщение отредактировал webpavilion - 12.9.2009, 22:51


--------------------
Не ведитесь, cамопис это почти всегда плохо!

Делаю сайты на Drupal 7.x
(очень дорого)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
skadushkin
skadushkin
сообщение 12.9.2009, 23:09; Ответить: skadushkin
Сообщение #4


думаю надо использовать implode


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Professor
Professor
сообщение 12.9.2009, 23:51; Ответить: Professor
Сообщение #5


Единственное что могу предложить =)
array_walk($array1, 'test_print');
function test_print($item2)
{
    if($item2["M"]=="c")
    echo 'все лабы автоматом';
}



Но работать будет медленней наверно =)

Сообщение отредактировал Professor - 12.9.2009, 23:52


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Zellegius
Zellegius
сообщение 13.9.2009, 10:42; Ответить: Zellegius
Сообщение #6


Вопрос действительно интересный. У меня в итоге нечего путного по заданию не получилось.

Автор, ты сумел сделать без циклов? Если да, то расскажи хотя бы как)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
DJA
DJA
сообщение 13.9.2009, 11:16; Ответить: DJA
Сообщение #7


Не специалист в пхп. Может здесь рекурсивную функцию надо использовать?
Вроде:

//переменные, которые должны быть доступны во всех функциях
int i = 0;
int gutXM = 0; //больше нуля - найден ключ, 0 - не найден


вызов:
checkkey($x);



//сама функция
function checkkey($x)
{

if (i >= $array.length)
return; //весь массив пройден, ключ не нашли. gutXM останется нулем

$variable = $array[i];

//сравниваем новое значение
if ($variable['M'] == $x)
{
//ключ найден
gutXM = i; //i - номер элемента массива с нужным ключем
return;
}
else
{
i++;
checkkey($x);
}

}


В общем как-то так smile.gif
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
brevis
brevis
сообщение 13.9.2009, 11:33; Ответить: brevis
Сообщение #8


Может как-то так:

<?php
function check($arr, $index, $x)
{
    if (is_array($arr) && $index<count($arr))
    {
        if (isset($arr[$index]))
        {
          if (isset($arr[$index]['M']) && $arr[$index]['M'] == $x) echo 'okokokok<br />';
        }
        
        check($arr, ++$index, $x);
    }
}

/*--------- Заполнение массива с данными для теста---------*/
$array = array();
for ($i=0;$i<100;$i++)
{
    $array[$i] = array('M'=>mt_rand(0, 9));

}
/*---------------------------------------------------------*/


$x = 3;

check($array, 0, $x);

?>


Сообщение отредактировал brevis - 13.9.2009, 11:37


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Professor
Professor
сообщение 13.9.2009, 11:41; Ответить: Professor
Сообщение #9


рекурсия в сотни раз хуже чем цикл!!
Потому что вызов функции сам по себе очень ресурсоемкий процесс.
да и строчек вы понаписали больше чем ТС =)


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
webpavilion
webpavilion
Topic Starter сообщение 13.9.2009, 14:12; Ответить: webpavilion
Сообщение #10


skadushkin, implode () для многомерного массива выведет Array,Array,Array
Zellegius, я сумел в 6 вариантах некоторые опубликовали раньше, есть еще как минимум 2 с использованием goto и с анонимной (lambda-style) функцией.
Professor, суть задания состояла не в скорости выполнения а в поиске нестандартных решений...

вот что получилось:

<?
$text = "
Александр Сергеевич Пушкин.
ЗИМНЕЕ УТРО 1823 год
Мороз и солнце; день чудесный!
Еще ты дремлешь, друг прелестный —
Пора, красавица, проснись:
Открой сомкнуты негой взоры
Навстречу северной Авроры,
Звездою севера явись!
Вечор, ты помнишь, вьюга злилась,
На мутном небе мгла носилась;
Луна, как бледное пятно,
Сквозь тучи мрачные желтела,
И ты печальная сидела —
А нынче... погляди в окно:
Под голубыми небесами
Великолепными коврами,
Блестя на солнце, снег лежит;
Прозрачный лес один чернеет,
И ель сквозь иней зеленеет,
И речка подо льдом блестит.
Вся комната янтарным блеском
Озарена. Веселым треском
Трещит затопленная печь.
Приятно думать у лежанки.
Но знаешь: не велеть ли в санки
Кобылку бурую запречь?
Скользя по утреннему снегу,
Друг милый, предадимся бегу
Нетерпеливого коня
И навестим поля пустые,
Леса, недавно столь густые,
И берег, милый для меня.
";
$line = explode (' ',$text);
for ($i=count($line);$i!=0;$i--){
    $a[] = array('l'=>$i,'m'=>md5($line[$i]));
}
$x = md5('Кобылку');
define ('OK', ": ok!<br>");

echo 1; //вариант решения
function t1 ($p) {if ($p['m']==$GLOBALS['x']) return OK;}
echo implode ('',array_map("t1", $a));

echo 2; //вариант решения
if (strpos(print_r($a,true),"> $x")) echo OK;

echo 3; //вариант решения
if (preg_match ("#> $x#s", print_r($a,true))) echo OK;

echo 4; //вариант решения
if (strstr(http_build_query($a,null,null),"=$x")) echo OK;

echo 5;  //вариант решения от Professor
array_walk($a, 'test_print');
function test_print($item2)
{
    if($item2["m"]==$GLOBALS['x'])
    echo OK;
}

echo 6; //вариант решенияидея от brevis, реализация DJA
function t3($a, $i, $x)
{
    if (is_array($a) && $i<count($a))
    {
        if (isset($a[$i]))
        {
          if (isset($a[$i]['m']) && $a[$i]['m'] == $x) echo OK;
        }
        t3($a, ++$i, $x);
    }
}
t3($a, 0, $x);

если кому интересно могу провести тест производительности.

Сообщение отредактировал webpavilion - 13.9.2009, 14:13


--------------------
Не ведитесь, cамопис это почти всегда плохо!

Делаю сайты на Drupal 7.x
(очень дорого)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Горячая тема (нет новых ответов) Betatransfer.net - прием платежей для HIGH RISK проектов, интернет эквайринг и мерчант онлайн оплат
55 arendator 35093 Сегодня, 2:12
автор: arendator
Открытая тема (нет новых ответов) Rebex.io – Ваша инновационная платформа для обмена криптовалюты!
3 Rebex 971 Вчера, 20:50
автор: Rebex
Открытая тема (нет новых ответов) Посоветуйте массажер для спины и шеи
10 Boymaster 905 Вчера, 18:02
автор: Boymaster
Открытая тема (нет новых ответов) Обучение Email Рассылкам + Софт Для Автоматизации (100к в сутки с сервера)
10 zennoboss 4664 Вчера, 5:20
автор: Skyworker
Открытая тема (нет новых ответов) Какой % отказов нормален для сайта?
14 Aloof 3384 23.4.2024, 13:50
автор: Vmir


 



RSS Текстовая версия Сейчас: 25.4.2024, 15:08
Дизайн