Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка из сложного массива 
:(
    Опции темы
Gold Dragon
  Дата 4.8.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Есть массив
Код

Array
(
    [1] => Array
        (
            [0] => firma
            [1] => Полное название предприятия
            [2] => ОАО 'Рога и Копыта'
        )
    [2] => Array
        (
            [0] => firmaAdr
            [1] => Полный адрес
            [2] => 392000, Тамбов, ул. Кукуева, д 34
        )

    [3] => Array
        (
            [0] => gorod
            [1] => Город
            [2] => г. Тамбов
        )

    [4] => Array
        (
            [0] => firmaAdrT
            [1] => описание места
            [2] => административное здание, четвертый этаж, кабинет № 56
        )

    [5] => Array
        (
            [0] => bos
            [1] => должность начальника
            [2] => генеральный директор
        )
)

мне необходимо определить переменные, чтобы получилось так
Код

$info['firma'] = "ОАО 'Рога и Копыта'";
$info['firmaAdr'] = "392000, Тамбов, ул. Кукуева, д 34";
$info['gorod'] = "г. Тамбов";
$info['firmaAdrT'] = "административное здание, четвертый этаж, кабинет № 56";
$info['bos'] = "генеральный директор";

теперь алгоритм на примере $info['firma']:
- мне нужно найти в массиве Array[x][0] значение 'firma',
- если такое существет присвоить $info['firma'] значение Array[x][2],
- если нет такого, то сохранить в $error[] значение 'firma'

Массив довольно большой и не хочется каждое значение проверять перелистывая весь массив с начала до конца.

В общем кто знает оптимальное решение, за мной не заржавеет ;)

ps
конец недели, башка кипит, но нужно очень срочно



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
skyboy
Дата 4.8.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 8
Всего: 260



исходный массив назовём $a.
Код

$count= count($a);
$error= array('firma','firmaAdr','gorod','firmaAdrT','bos');
for($i= 0; $i< $count; $i++)
{
 $info[$a[0]]= $a[$i][2];
 // тут надо удалить соотвествующий элемент из массива error, но у меня тоже конец недели - ничего в голову не лезет
}


PM MAIL   Вверх
Gold Dragon
Дата 4.8.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



skyboy, наверное нужно передахнуть.... читаю твой код и ничего не понимаю  smile 

вот мои данные 
index.php
Код

<?php
ini_set( 'display_errors' , '1' );
error_reporting(E_ALL);

define( '_INDEX', 1 );

$data = file ('dat.csv');
$error = Array();

for($i=0; $i<count($data); $i++){
    $dataTemp = explode(";", $data[$i]);
    $infoArray[$i][0] = $dataTemp[0];
    $infoArray[$i][1] = $dataTemp[1];
    $infoArray[$i][2] = $dataTemp[2];
    $infoArray[$i][3] = $dataTemp[3];
}

$info['firma'] = errerArray('firma');
$info['firmaAdr'] = errerArray('firmaAdr');
$info['gorod'] = errerArray('gorod');
$info['firmaAdrT'] = errerArray('firmaAdrT');
$info['bos'] = errerArray('bos');
$info['bosFio'] = errerArray('bosFio');
$info['bosRp'] = errerArray('bosRp');
$info['bosFioRp'] = errerArray('bosFioRp');
$info['arm'] = errerArray('arm');
$info['vpvtc'] = errerArray('vpvtc');
$info['komBos'] = errerArray('komBos');
$info['komBosFio'] = errerArray('komBosFio');
$info['komBosRp'] = errerArray('komBosRp');
$info['komBosFioRp'] = errerArray('komBosFioRp');
$info['kom'] = errerArray('kom');
$info['komFio'] = errerArray('komFio');
$info['komRp'] = errerArray('komRp');
$info['komFioRp'] = errerArray('komFioRp');
$info['komDokVp'] = errerArray('komDokVp');
$info['obName'] = errerArray('obName');
$info['obSer'] = errerArray('obSer');
$info['obInv'] = errerArray('obInv');
$info['grif'] = errerArray('grif');
$info['usl'] = errerArray('usl');
$info['kat'] = errerArray('kat');
$info['qqq'] = errerArray('qqq'); // тестовый элемент
$info['qqq1'] = errerArray('qqq1');// тестовый элемент

if(count($error)>0){
    include('err.php');
    $content = err($error);
}else{
    $content = 'OK';
}

function errerArray($per){
//*************************************************************************
// проверка всех констант
//*************************************************************************
    GLOBAL $infoArray, $error;
    $tmp = '~~~';
    for($i=0; $i<count($infoArray); $i++){
        if($infoArray[$i][0]==$per){
            $tmp = $infoArray[$i][2];
        }
    }
    if($tmp=='~~~'){
        $error[] = 'Не определена переменная "'.$per.'".<br>';
    }
    if($tmp==''){
        $error[] = 'Переменная "'.$per.'" пуста.<br>';
    }
    return $tmp;
}
echo $content;
?>


err.php
Код

<?php
defined( '_INDEX' ) or die( 'Доступ запрещен' );

function err($error){
    $errorAll = '';
    for($i=0; $i<count($error); $i++){
        $errorAll .= $error[$i];
    }
return <<<EOF
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Ошибка файла данных</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<div align="center">
<p>&nbsp;</p>
<p><h2>Ошибка!</h2>{$errorAll}</p>
</div>
</body>
</html>
EOF;
}
?>


dat.csv
Код

Переменная;Название;Данные;Пример
firma;Полное название предприятия;ОАО 'Рога и Копыта';ОАО 'Рога и Копыта'
firmaAdr;Полный адрес;392000, Тамбов, ул. Кукуева, д 34;392000, Тамбов, ул. Кукуева, д 34
gorod;Город;г. Тамбов;г. Тамбов
firmaAdrT;описание места;административное здание, четвертый этаж, кабинет № 56;административное здание, четвертый этаж, кабинет № 56
bos;должность начальника;генеральный директор;генеральный директор
bosFio;инициалы и фамилия директора;И.И. Пупкин;И.И. Пупкин
bosRp;должность (р.п.);генерального директора;генерального директора
bosFioRp;ФИО (р.п.);И.И. Пупкина;И.И. Пупкина
arm;АРМ;АРМ-1-ПМ;АРМ-1-ПМ
Акт категорирования выделенных помещений и технических средств и систем ;;;~
vpvtc;ВПиВТиС (р.п.);автономной ПЭВМ LinXworld зав. № 5001080644913, инв. №56/0;автономной ПЭВМ LinXworld зав. № 5001080644913, инв. №56/0
komBos;председ. Должность;начальник отдела;начальник отдела
komBosFio;председ. ФИО;А.А. Иванов;А.А. Иванов
komBosRp;председ. Должность (р.п.);начальника отдела;начальника отдела
komBosFioRp;председ. ФИО (р.п.);А.А. Иванова;А.А. Иванова
kom;член. Долж;инженер#секретарь;инженер#секретарь
komFio;член. ФИО;В.В. Норкин#В.У.Пашина;В.В. Норкин#В.У.Пашина
komRp;член. Долж (р.п.);инженера#секретаря;инженера#секретаря
komFioRp;член. ФИО (р.п.);В.В. Норкина#В.У.Пашиной;В.В. Норкина#В.У.Пашиной
komDokVp;тип документа комиссии (т.п.);распоряжением;распоряжением
obName;Наименование оборудования;Системный блок LinXworld LW-313R;Системный блок LinXworld LW-313R
obSer;Серийный  номер;7365487374;7365487374
obInv;Инвентарный номер;60/6;60/6
grif;высший гриф;секретно;секретно
usl;условия расположения;обычные;обычные
kat;категория;2;2
А К Т классификации АС по требованиям защиты информации;;;~
qqq;тест;;
*;*;*;*

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


PS
вообще ничего не лезит, а в понедельник уже надо с прогой работать smile

Это сообщение отредактировал(а) Gold Dragon - 4.8.2006, 21:08


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
skyboy
Дата 4.8.2006, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 8
Всего: 260



так... может, это я чего не понял?
давай, не с начала. Пусть у нас уже есть в $data - построчно файл. Теперь:
Код

$var_names= array('firmaAdr','gorod','firmaAdrT','bos','bosFio','usl','kat'); // имена переменных, которые мы собираемся обрабатывать - входной параметр
$var_real= array();// имена тех переменных, которые были приняты; выходной параметр
$var_notconfirm= array(); // имена тех строк, которые нафиг не нужны; выходной параметр
$count= count($data); // при большом количестве строк будет уже критично - один раз вызывается подсчёт количества элементов массива или при каждой итерации массива
for($i= 0; $i< $count; $i++)
{
 $dataTemp = explode(";", $data[$i]);
 if(array_search($data[0],$var_names))
 {
   $info[$dataTemp[0]]= $dataTemp[2];
   $var_real[]= $dataTemp[0];
 }
 else
  $var_notconfirm[]= $dataTemp[0];
}
/* после цикла у нас в каждом элементе info['имя_переменной'] нужная нам информация; в $var_notconfirm - список имен параметров, которые к нам пришли "непрошенно"; чтоб получить список недополученных параметров, сделаем так: */
$var_noresponded= array_diff($var_names,$var_real);
// внимание! в массиве $var_noresponsed ключи будут идти не подряд, а так, как шли в массиве $var_names

Если я сам не перенапрягся, то должно работать. К сожалению, дома проверить не могу smile
PM MAIL   Вверх
Gold Dragon
Дата 5.8.2006, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



skyboy, что-то подставляю $data, во выдаёт ошибку... Но логику понял! попробуя переписать


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
skyboy
Дата 5.8.2006, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 8
Всего: 260



в 8 строке  вместо $data должно быть $dataTemp.
Вот подправленный вариант:
Код

<?php
ini_set( 'display_errors' , '1' );    
error_reporting(E_ALL);    
define( '_INDEX', 1 );
$data = file ('file.csv');
$info= array();
$var_names= array('firmaAdr','gorod','firmaAdrT','zzz','bos','bosFio','usl','kat'); // имена переменных, которые мы собираемся обрабатывать - входной параметр    
$var_real= array();// имена тех переменных, которые были приняты; выходной параметр    
$var_notconfirm= array(); // имена тех строк, которые нафиг не нужны; выходной параметр    
$var_noresponsed= array();
$count= count($data); // при большом количестве строк будет уже критично - один раз вызывается подсчёт количества элементов массива или при каждой итерации массива    
for($i= 0; $i< $count; $i++)    
{    
 $dataTemp = explode(";", $data[$i]);    
 if(array_search($dataTemp[0],$var_names))    
 {    
   $info[$dataTemp[0]]= $dataTemp[2];    
   $var_real[]= $dataTemp[0];    
 }    
 else    
  $var_notconfirm[]= $dataTemp[0];    
}    
/* после цикла у нас в каждом элементе info['имя_переменной'] нужная нам информация; в $var_notconfirm - список имен параметров, которые к нам пришли "непрошенно"; чтоб получить список недополученных параметров, сделаем так: */    
$var_noresponsed= array_diff($var_names,$var_real);    
// внимание! в массиве $var_noresponsed ключи будут идти не подряд, а так, как шли в массиве $var_names
print "<b>Данные:</b> <br>\n";
foreach($info as $keyname => $value)
 print '"'.$keyname.'" => '.$value."<br>\n";
print "<br><b>Ненужные переменные(и строки):</b><br>\n";
$count= count($var_notconfirm);
for($i= 0; $i< $count; $i++)
 print $var_notconfirm[$i]."<br>\n";        
print "<br><b>Не были получены следующие переменные:</b><br>\n"; 
foreach($var_noresponsed as $value)
 print $value;
?>


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.