объединить и удалить одинаковое из многомерного массива

Graf_Vorontsov

Новичок
PHP:
while(($data_nalichie = fgetcsv($price, 1000, "\t"))!==FALSE){
            $data_nalichie[] = "наличие \n";
            //echo $data_nalichie[5];
}
while(($data_zakaz = fgetcsv($price_dop, 1000, "\t"))!==FALSE){
$data_zakaz[] = "заказ \t";
            //echo $data_zakaz[5];  
}
$data_uniq = array_unique(array_merge($data_nalichie, $data_zakaz));

надо объединить и удалить одинаковые строки этих 2х массивов полученных данных из csv ... не получается
мне кажется надо в цикле написать... но циклы у них разные.. а как в один запихнуть не пойму.
 

radioheaded

PHP нуб
1. Если одинаковые строки надо удалять, то зачем вы в цикле пихаете в них кучу одинаковых строк?
2. Приведите реальные примеры входных данных. Вот первый массив, там такие-то строки, вот второй, вот что я получаю после array_merge, а вот что после array_unique. А потом приведите то, что на самом деле вам нужно получить. Так будет гораздо легче.
 

radioheaded

PHP нуб
Ой, я и не заметил, у вас вообще фигня какая-то написана. Прочитайте мануал к fgetcsv. В целом ход мысли верный, только данные надо сохранять, а не перетирать каждый раз.
 

Graf_Vorontsov

Новичок
дело в том что цикл fgetcsv работал у меня нормально.

вот скрипт
PHP:
//функция для удаления лишних символов из строки поиска и из файла
      
        function normalize_number($data_corected) {
            return preg_replace("#\W#", "", $data_corected);
        }
        function are_numbers_equal($number1, $number2) {
            return strstr(normalize_number($number1), normalize_number($number2));
        }
    

    
        //разбираем на части базу из файла
    
        while (($data = fgetcsv($price, 1000, "\t")) !== FALSE) {

            echo "<tr>";
        
            if (!empty($_REQUEST['number'])and isset($_REQUEST['number'])and(strlen($_REQUEST['number']) >= 4)){ 
            
            //если введены данные, выполняеся поиск
              
            //проверка на русские буквы! Запрет.
            
                if (!preg_match("#[-_a-zA-Z\d\.\s]+$#i", $_REQUEST['number'])){
                    //die("<center><br><h2><font color=red>Кириллица запрещена! Разрешены только буквы латинского алфавита и цифры! </font></h2><br /><br /></center>");
                    echo "<center><br><h2><font color=red>Кириллица запрещена! Разрешены только буквы латинского алфавита и цифры! </font></h2><br /><br /></center>";
                    break 1;
                }else{
              
                    //удаляем пробелы в начале и в конце строки, переводим все символы в верхний регистр  
              
                    $_REQUEST['number'] = strtoupper(trim($_REQUEST['number']));
                    $return = str_replace("  "," ", $_REQUEST['number']);
                                    
                    //ищем номер в массиве данных 
            
                    foreach($data as $value) {
                
                        $data[4]=(str_replace(",", ".", $data[4]));
                
                        $cena = round($data[4] * $kurs);
                
                        if (are_numbers_equal($value, $return)) {
                                    
                            //вывод результата в виде таблицы 
                            
                            echo "<td style='padding: 6px;'>$data[0]</td><td style='padding: 6px;'>$data[1]</td><td style='padding: 6px;'>$data[2]</td><td style='padding: 6px;'>$data[3]</td><td style='padding: 6px;'>$cena</td>"; //если введены данные, выдать найденый результат   
 
                        }

                            
                            
                    }  
                                  
                }
                    
            
                 
                
            }else {
            
            //если ничего не ввели в поле поиска
                echo "<center><br><h2><font color=red>Вы ничего не ввели, или ввели мало символов </font></h2><br /><br /></center>";
                break 1;            
            //exit("<center><br><h2><font color=red>Вы ничего не ввели, или ввели мало символов </font></h2><br /><br /></center>");            
        
            }
        
            echo "</tr>";

        } //end while
        
        //цикл while для второго файла
        while (($data_dop = fgetcsv($price_dop, 1000, "\t")) !== FALSE) {

                                echo "<tr>";
                                if (!empty($_REQUEST['number'])and isset($_REQUEST['number'])and(strlen($_REQUEST['number']) >= 4)){ 
            
                                    //если введены данные, выполняеся поиск
              
                                    //проверка на русские буквы! Запрет.
            
                                    if (!preg_match("#[-_a-zA-Z\d\.\s]+$#i", $_REQUEST['number'])){
                                        //die("<center><br><h2><font color=red>Кириллица запрещена! Разрешены только буквы латинского алфавита и цифры! </font></h2><br /><br /></center>");
                                        echo "<center><br><h2><font color=red>Кириллица запрещена! Разрешены только буквы латинского алфавита и цифры! </font></h2><br /><br /></center>";
                                        break 1;
                                        }else{
              
                                            //удаляем пробелы в начале и в конце строки, переводим все символы в верхний регистр  
              
                                            $_REQUEST['number'] = strtoupper(trim($_REQUEST['number']));
        
                                            //удаляем пробелы в начале и в конце строки, переводим все символы в верхний регистр  
              
                                            $return_dop = strtoupper(trim($_REQUEST['number']));
              
                                            //ищем номер в массиве данных 
                                           
                                            foreach($data_dop as $value_dop) {
                                                
                                                $data_dop[4]=(str_replace(",", ".", $data_dop[4]));
                
                                                $cena_dop = round($data_dop[4] * $kurs);

                                                if (are_numbers_equal($value_dop, $return_dop)) 
                    
                                                //вывод результата в виде таблицы 
                    
                                                echo "<td style='padding: 6px;'>$data_dop[0]</td><td style='padding: 6px;'>$data_dop[1]</td><td style='padding: 6px;'>$data_dop[2]</td><td style='padding: 6px;'>$data_dop[3]</td><td style='padding: 6px; background-color: #CB0909;'>$cena_dop <font>под заказ</font></td>"; //если введены данные, выдать найденый результат                          
                
                                            }    
                                    }
                  
                                echo "</tr>";
        
                                }   
                            }
        
    echo "</table></center>";

    fclose($price_dop);
    fclose($price);
но дело в том что я не могу прервать работу скрипта на моменте когда найдено первое значение, чтоб не искало дальше.

вот после этого
PHP:
                        if (are_numbers_equal($value, $return)) {
                                    
                            //вывод результата в виде таблицы 
                            
                            echo "<td style='padding: 6px;'>$data[0]</td><td style='padding: 6px;'>$data[1]</td><td style='padding: 6px;'>$data[2]</td><td style='padding: 6px;'>$data[3]</td><td style='padding: 6px;'>$cena</td>"; //если введены данные, выдать найденый результат   
 
                        }
exit не могу использовать, т.к. у меня обрывается весь скрипт полностью, а нельзя, т.к. это компонент joomla и если применить exit то шаблон слетает и грузится чистая страница без навигации и шаблона.

поэтому решил пойти другим путём, объединить массивы данных из 2х файлов и поудалять одинаковые данные.. + условие.
но както не так видимо делаю. может укажете что не так написал?
а пока пойду читать внимательней манул по fgetcsv
 

Graf_Vorontsov

Новичок
PHP:
    while(($data_nalichie = fgetcsv($price, 1000, "\t"))!==FALSE){
        for( $n = 0; $n < count($data_nalichie); $n++ ){
            echo $data_nalichie[$n]."</br>\n";
        }
        while(($data_zakaz = fgetcsv($price_dop, 1000, "\t"))!==FALSE){
            for( $z = 0; $z < count($data_zakaz); $z++ ){
                echo $data_zakaz[$z]."</br>\n";
            }
        }//end while 2

    }//end while
вот какой цикл у меня получился

правильно? или я опять не туда ушёл?
как соединить теперь эти 2 многомерных массива данных?
 

radioheaded

PHP нуб
Откуда я знаю, правильно или нет? Вы так и не показали, что именно хотите сделать. Все-таки найдите в себе силы прочитать мой комментарий еще раз.
 

Graf_Vorontsov

Новичок
1. Если одинаковые строки надо удалять, то зачем вы в цикле пихаете в них кучу одинаковых строк?
2. Приведите реальные примеры входных данных. Вот первый массив, там такие-то строки, вот второй, вот что я получаю после array_merge, а вот что после array_unique. А потом приведите то, что на самом деле вам нужно получить. Так будет гораздо легче.
0. Прошу прощения за мою невнимательность
1.Если я не пихаю в цикл, то массив из файла не считывается, только первая строка(т.е первый массив). Вот что в файле
KONI 8250 1004 "Audi A6; VW Passat задний" 2 40,06
KONI 8250 1011 "Audi A4; Seat Exeo передний" 2 66,74
KONI 8250 1021 BMW задний 2 65
KONI 8650 1007 Audi 100, A6 передний 2 56,28
KONI 8650 1012 Lada Samara передний 2 44,97
и таких строк много, в другом файле 50% такой же информации + другие номера

KONI 8250 1004 "Audi A6; VW Passat задний" 2 40,06
KONI 8250 1011 "Audi A4; Seat Exeo передний" 2 66,74
KONI 8250 1021 BMW задний 2 65
KONI 26 1575SPORT Mercedes-Benz передний 2 66,37
KONI 26 1576SPORT Mercedes-Benz задний 2 66,37
KONI 26 1679SPORT Mercedes-Benz задний 2 81,78
KONI 26 1690 Daewoo (Chevrolet) Tacuma задний 2 79,66
после array_merge хочу получить общий массив, а вот после array_unique убрать из этого массива повторяющиеся строки(массивы), а после производить уже поиск по полученному массиву
 

radioheaded

PHP нуб
Тогда повторю второй комментарий: если вы хотите сохранять строки в массив, то нужно сохранять их (КО).

Вообще, если данных немного, то
PHP:
var_dump(array_unique(array_merge(file($price), file($price_dop))));
fgetcsv вам не нужен, если вам действительно нужно сравнивать целые строки.

Если данных много, то лучше считывать построчно, сохранять в массив (можно сразу в один) и затем его в array_unique.
 

Graf_Vorontsov

Новичок
если так
PHP:
var_dump(array_unique(array_merge(file($price), file($price_dop))));
то вот что показало file() expects parameter 1 to be string, resource given

файл вроде не большой, 1000 строк

Тогда повторю второй комментарий: если вы хотите сохранять строки в массив, то нужно сохранять их (КО).
та вот сижу и думаю как сохранить эти строки для дальнейшего использования.... туговато.
 

radioheaded

PHP нуб
То есть, вы мне показываете ошибку, чтобы я вам рассказал, откуда она взялась? Единственное, что я могу посоветовать цензурными словами — подучите PHP. Почитайте мануал к используемым вами функциям, почитайте любую книжку по PHP.
 

Graf_Vorontsov

Новичок
я понимаю что вас нервирует люди которые плохо знают то что вы отлично знаете, но ничего с этим поделать нельзя. Для таких как я и существуют форумы! я ищу помощи, подсказок и т.д. я не спец, я новичёк! учусь пока, читал милин раз уже про эти функции что использую, но если я чегото не понимаю, то не надо ругаться, хотите помочь, помогите - нет я не заставляю, спасибо что пытались, буду разбираться.

по поводу этого
file() expects parameter 1 to be string, resource given
я знаю что тут написано! не читает эта функция file в массив!!, по крайней мере на сколько я знаю, вот и ошибка отсюда.
 

radioheaded

PHP нуб
я понимаю что вас нервирует люди которые плохо знают то что вы отлично знаете, но ничего с этим поделать нельзя. Для таких как я и существуют форумы! я ищу помощи, подсказок и т.д. я не спец, я новичёк! учусь пока, читал милин раз уже про эти функции что использую, но если я чегото не понимаю, то не надо ругаться, хотите помочь, помогите - нет я не заставляю, спасибо что пытались, буду разбираться.

по поводу этого
file() expects parameter 1 to be string, resource given
я знаю что тут написано! не читает эта функция file в массив!!, по крайней мере на сколько я знаю, вот и ошибка отсюда.
Меня никто не нервирует. Мне не нравятся люди, которые говорят «я знаю что тут написано! не читает эта функция file в массив!!» вместо того, чтобы пойти и почитать мануал, который даже на русском в наше время существует. Я вам привел пример кода, а не кусок, который нужно было просто вставить и использовать. Вам ошибка человеческим языком написана (не знаете английского — ок, есть онлайн переводчики), а вы все равно упрямо продолжаете пороть чушь. Успехов.
 

С.

Продвинутый новичок
по поводу этого
file() expects parameter 1 to be string, resource given
я знаю что тут написано! не читает эта функция file в массив!!
Возьми словарь или онлайн переводчик и переведи. Не позорься уж.
Надеюсь ты не новичек в пользовании словарем?
 
Сверху