Avatar billede expnet Seniormester
13. februar 2012 - 01:15 Der er 18 kommentarer og
1 løsning

array samle nogle id sammen?

hej eksperter

Jeg sidder og forsøger at tilpasse min array som kommer ved at hente en tekstfil frem

Eksempel fra array:
(vælger ikke at liste alle da der er pæn mange)

Array
(
    [0] => artikel nummer
    [1] => titel/emne
    [2] => subtitel/subemne
    [3] => random_nummer
    [4] => person navn
    [5] => kategorinavn
    [6] => subkategorinavn1
    [7] => subkategorinavn2
    [8] => subkategorinavn3
    [9] => Udenlandske sprog ja/nej
    [10] => andet1
    [11] => andet2
)

Forklare her (Spørgsmålet):

Når den looper igennem min array ved navnet $data

vil jeg gerne have at den samler 5,6,7,8 sammen.
Så det kom til at se ud som denne array


Array
(
    [0] => artikel nummer
    [1] => titel/emne
    [2] => subtitel/subemne
    [3] => random_nummer
    [4] => person navn
    [5] => kategorinavn/subkategorinavn1/subkategorinavn2/subkategorinavn3
    [9] => Udenlandske sprog ja/nej
    [10] => andet1
    [11] => andet2
)
Avatar billede olebole Juniormester
13. februar 2012 - 02:36 #1
<ole>

Det må vel kunne gøres sådan:

$data[5] = $data[5].'/'.$data[6].'/'.$data[7].'/'.$data[8];
unset($data[6], $data[7], $data[8]);
var_dump($data);

/mvh
</bole>
Avatar billede inteeeL Nybegynder
13. februar 2012 - 12:01 #2
Hej expnet.

Du kan løse dit problem ved at tjekke, om en værdi indeholder enten 'kategori' eller 'subkategorinavn' - i  en loop selvfølgelig. Hvis værdien indeholder en af de to ovenstående værdier, skal der bygges en variabel op med denne værdi, hvorefter elementet slettes/unsettes. Det er nok nemmere blot at illustrere.

<?php

$array = array(
    0 => 'artikel nummer',
    1 => 'title/emne',
    2 => 'subtitle/subemne',
    3 => 'random nummer',
    4 => 'person navn',
    5 => 'kategori navn',
    6 => 'subkategorinavn 1',
    7 => 'subkategorinavn 2',
    8 => 'subkategorinavn 3',
    9 => 'udenlandske sprog ja/nej',
    10 => 'andet1',
    11 => 'andet2'
);

$buildValue = '';
foreach( $array as $key => $value) {
    if(( strpos( $value, 'kategori') !== false) || ( strpos( $value, 'subkategorinavn') !== false)) {
        if( $key != 8) {
            $buildValue .= $value.'/';
            unset($array[$key]);
        }
        else {
            $buildValue = $buildValue.$value;
            $array[$key] = $buildValue;
        }
    }
}

$array = array_values( $array);

echo '<pre>';
var_dump($array);
echo '</pre>';

?>


array_values() har jeg brugt for afslutningsvis at indeksere arrayet numerisk. Jeg er åben for spørgsmål.
Avatar billede inteeeL Nybegynder
13. februar 2012 - 12:04 #3
Der var olebole hurtigere. :-)
Avatar billede expnet Seniormester
13. februar 2012 - 12:59 #4
inteeeL -> har lige et spørgsmål


kategori navnene og subkategorinavn er ikke altid de samme så jeg vil du skrive if pæn mange gange og det ville jeg gerne undgå
Avatar billede inteeeL Nybegynder
13. februar 2012 - 13:29 #5
Hvad mener du? Kan du give et eksempel på, hvordan et arraydump ville se ud?
Avatar billede expnet Seniormester
13. februar 2012 - 13:35 #6
array(
    0 => 'artikel nummer',
    1 => 'title/emne',
    2 => 'subtitle/subemne',
    3 => 'random nummer',
    4 => 'person navn',
    5 => 'PHP',
    6 => 'Modules',
    7 => 'Pay',
    8 => 'Free',
    9 => 'udenlandske sprog ja/nej',
    10 => 'andet1',
    11 => 'andet2'
);

array(
    0 => 'artikel nummer',
    1 => 'title/emne',
    2 => 'subtitle/subemne',
    3 => 'random nummer',
    4 => 'person navn',
    5 => 'ASP',
    6 => 'Modules',
    7 => 'Free',
    8 => 'Pay',
    9 => 'udenlandske sprog ja/nej',
    10 => 'andet1',
    11 => 'andet2'
);

array(
    0 => 'artikel nummer',
    1 => 'title/emne',
    2 => 'subtitle/subemne',
    3 => 'random nummer',
    4 => 'person navn',
    5 => 'JAVA',
    6 => 'Scripts',
    7 => 'docs',
    8 => 'demo',
    9 => 'udenlandske sprog ja/nej',
    10 => 'andet1',
    11 => 'andet2'
);
Avatar billede inteeeL Nybegynder
13. februar 2012 - 13:44 #7
Så 4-8 skal blot trækkes sammen i hvert array. Dette skulle gøre det:

<?php

$array = array(
    0 => 'artikel nummer',
    1 => 'title/emne',
    2 => 'subtitle/subemne',
    3 => 'random nummer',
    4 => 'person navn',
    5 => 'kategori navn',
    6 => 'subkategorinavn 1',
    7 => 'subkategorinavn 2',
    8 => 'subkategorinavn 3',
    9 => 'udenlandske sprog ja/nej',
    10 => 'andet1',
    11 => 'andet2'
);

$buildValue = '';
foreach( $array as $key => $value) {
    if(( $key > 4) && ( $key < 9)) {
        if( $key != 8) {
            $buildValue .= $value.'/';
            unset($array[$key]);
        }
        else {
            $buildValue .= $value;
            $array[$key] = $buildValue;
        }
    }
}

$array = array_values( $array);

echo '<pre>';
var_dump($array);
echo '</pre>';

?>
Avatar billede inteeeL Nybegynder
13. februar 2012 - 14:07 #8
Du kan også holde det simpelt ved at benytte oleboles forslag - så slipper du får et kører en loop igennem. Olebole har før nævnt KISS-princippet Keep it simple, Stupid!, og det bliver der gjort med hans forslag. :-)

<?php

$array = array(
    0 => 'artikel nummer',
    1 => 'title/emne',
    2 => 'subtitle/subemne',
    3 => 'random nummer',
    4 => 'person navn',
    5 => 'kategori navn',
    6 => 'subkategorinavn 1',
    7 => 'subkategorinavn 2',
    8 => 'subkategorinavn 3',
    9 => 'udenlandske sprog ja/nej',
    10 => 'andet1',
    11 => 'andet2'
);

$array[5] = $array[5].'/'.$array[6].'/'.$array[7].'/'.$array[8];
unset($array[6], $array[7], $array[8]);

$array = array_values( $array);

echo '<pre>';
var_dump($array);
echo '</pre>';

?>
Avatar billede expnet Seniormester
13. februar 2012 - 14:27 #9
inteeeL -> Jeg kan pt godt lide dit eksempel da jeg også undervejs har fundet ud af 3 små problemer med mine arrays måske kan du hjælpe med det ellers virker det fint det du har lavet

De 3 små fejl/problemer

1. Har nogle tomme array felter - ville gerne have fjernet
2. Og når vi snakke der hvor kategorier kommer ud har jeg glemt at sige at hvis der _ skulle ikke sammle/tages med


Eksempel:

$array = array(
    0 => 'artikel nummer',
    1 => 'title/emne',
    2 => 'subtitle/subemne',
    3 => '',
    4 => 'Per Jensen',
    5 => 'PHP',
    6 => 'Modules',
    7 => '_',
    8 => 'Pay',
    9 => 'udenlandske sprog ja/nej',
    10 => '',
    11 => 'andet2'
);

Blive til :P)

$array = array(
    0 => 'artikel nummer',
    1 => 'title/emne',
    2 => 'subtitle/subemne',
    3 => 'Per Jensen',
    4 => 'PHP/Modules/Pay',
    5 => 'udenlandske sprog ja/nej',
    6 => 'andet2'
);
Avatar billede inteeeL Nybegynder
13. februar 2012 - 18:09 #10
<?php

$array = array(
    0 => 'artikel nummer',
    1 => 'title/emne',
    2 => 'subtitle/subemne',
    3 => '',
    4 => 'Per Jensen',
    5 => 'PHP',
    6 => 'Modules',
    7 => '_',
    8 => 'Pay',
    9 => 'udenlandske sprog ja/nej',
    10 => '',
    11 => 'andet2'
);

$buildValue = '';
foreach( $array as $key => $value) {
    if(($value == '') || ( $value == '_')) {
        unset($array[$key]);
    }
    if(( $key > 4) && ( $key < 9) && ( $value != '') && ( $value != '_')) {
        if( $key != 8) {
            $buildValue .= $value.'/';
            unset($array[$key]);
        }
        else {
            $buildValue .= $value;
            $array[$key] = $buildValue;
        }
    }
}

$array = array_values( $array);

echo '<pre>';
var_dump($array);
echo '</pre>';

?>
Avatar billede expnet Seniormester
14. februar 2012 - 19:59 #11
Er det bare mig der ikke kan få til at virke rigtigt med min tekst fil

    foreach($lines as $line){
        $line = trim($line,"|");
        $array = explode("|",$line);

            $buildValue = '';
            foreach( $array as $key => $value) {
                if(($value == '') || ( $value == '_')) {
                    unset($array[$key]);
                }
                if(( $key > 4) && ( $key < 9) && ( $value != '') && ( $value != '_')) {
                    if( $key != 8) {
                        $buildValue .= $value.'/';
                        unset($array[$key]);
                    }
                    else {
                        $buildValue .= $value;
                        $array[$key] = $buildValue;
                    }
                }

            }
           
            $array = array_values($array);
            echo '<pre>';
            var_dump($array);
            echo '</pre>';
    }

}
Avatar billede inteeeL Nybegynder
14. februar 2012 - 20:23 #12
Hvad er det, der ikke virker? Udskrives der en fejl? Du kan også lige vise, hvordan din tekstfil ser ud, så jeg kan se, om du håndterer den rigtigt.
Avatar billede expnet Seniormester
15. februar 2012 - 00:09 #13
12a3m51|test1|ScriptCode|56813541|Rene|PHP|Modules|Pay|_|nej|mail|tlf
12b3c55|test1|ScriptCode|56813542|Rene|PHP|Modules|Pay|Banner|nej|mail|tlf
12c3u59|test1|ScriptCode|56813543|Rene|PHP|Modules|_|MailForm|nej|mail|tlf
12d3j00|test1|ScriptCode|56813544|Rene|PHP|Modules|Free|Loader|nej|mail|tlf
12e3k44|test1|ScriptCode|56813545|Rene|PHP|Modules|Free|_|nej|mail|tlf
12f3d77|test1|ScriptCode|56813546|Rene|PHP|Modules|_|Link|nej|mail|tlf
12g3g94|test1|ScriptCode|56813547|Rene|PHP|Modules|Free|NewList|nej|mail|tlf
Avatar billede expnet Seniormester
15. februar 2012 - 00:11 #14
Det lige som om den kun vil tage nogle af dem og lave det om

array(8) {
  [0]=>
  string(7) "12a3m51"
  [1]=>
  string(5) "test1"
  [2]=>
  string(10) "ScriptCode"
  [3]=>
  string(8) "56813541"
  [4]=>
  string(4) "Rene"
  [5]=>
  string(3) "nej"
  [6]=>
  string(4) "mail"
  [7]=>
  string(3) "tlf"
}

array(9) {
  [0]=>
  string(7) "12b3c55"
  [1]=>
  string(5) "test1"
  [2]=>
  string(10) "ScriptCode"
  [3]=>
  string(8) "56813542"
  [4]=>
  string(4) "Rene"
  [5]=>
  string(22) "PHP/Modules/Pay/Banner"
  [6]=>
  string(3) "nej"
  [7]=>
  string(4) "mail"
  [8]=>
  string(3) "tlf"
}

array(9) {
  [0]=>
  string(7) "12c3u59"
  [1]=>
  string(5) "test1"
  [2]=>
  string(10) "ScriptCode"
  [3]=>
  string(8) "56813543"
  [4]=>
  string(4) "Rene"
  [5]=>
  string(20) "PHP/Modules/MailForm"
  [6]=>
  string(3) "nej"
  [7]=>
  string(4) "mail"
  [8]=>
  string(3) "tlf"
}

array(9) {
  [0]=>
  string(7) "12d3j00"
  [1]=>
  string(5) "test1"
  [2]=>
  string(10) "ScriptCode"
  [3]=>
  string(8) "56813544"
  [4]=>
  string(4) "Rene"
  [5]=>
  string(23) "PHP/Modules/Free/Loader"
  [6]=>
  string(3) "nej"
  [7]=>
  string(4) "mail"
  [8]=>
  string(3) "tlf"
}

array(8) {
  [0]=>
  string(7) "12e3k44"
  [1]=>
  string(5) "test1"
  [2]=>
  string(10) "ScriptCode"
  [3]=>
  string(8) "56813545"
  [4]=>
  string(4) "Rene"
  [5]=>
  string(3) "nej"
  [6]=>
  string(4) "mail"
  [7]=>
  string(3) "tlf"
}

array(9) {
  [0]=>
  string(7) "12f3d77"
  [1]=>
  string(5) "test1"
  [2]=>
  string(10) "ScriptCode"
  [3]=>
  string(8) "56813546"
  [4]=>
  string(4) "Rene"
  [5]=>
  string(16) "PHP/Modules/Link"
  [6]=>
  string(3) "nej"
  [7]=>
  string(4) "mail"
  [8]=>
  string(3) "tlf"
}

array(9) {
  [0]=>
  string(7) "12g3g94"
  [1]=>
  string(5) "test1"
  [2]=>
  string(10) "ScriptCode"
  [3]=>
  string(8) "56813547"
  [4]=>
  string(4) "Rene"
  [5]=>
  string(24) "PHP/Modules/Free/NewList"
  [6]=>
  string(3) "nej"
  [7]=>
  string(4) "mail"
  [8]=>
  string(3) "tlf"
}
Avatar billede expnet Seniormester
15. februar 2012 - 09:17 #15
udmiddelbart lader det til at det virker det her


        if($array[11] > 0){
            $array_7 = (empty($array[9]) || $array[9] == "_")? '' : str_replace("/", "-", $array[9]);
            $array_6 = (empty($array[8]) || $array[8] == "_")? '' : str_replace("/", "-", $array[8]);
            $array_5 = (empty($array[7]) || $array[7] == "_")? '' : str_replace("/", "-", $array[7]);
            $array_4 = (empty($array[6]) || $array[6] == "_")? '' : str_replace("/", "-", $array[6]);
            $array_3 = (empty($array[5]) || $array[5] == "_")? 'Andet' : str_replace("/", "-", $array[5]);
           
            $array_7 = (empty($array_7))? '' : '/'.$array_7;
            $array_6 = (empty($array_6))? '' : '/'.$array_6;
            $array_5 = (empty($array_5))? '' : '/'.$array_5;
            $array_4 = (empty($array_4))? '' : '/'.$array_4;
            $array_3 = (empty($array_3))? '' : $array_3;
           
                       
            $array_1 = $array[0];
            $array_2 = $array[1];
            $array_8 = $array[10];
            $array_9 = $array[11];
               
            $arrayData[] = array(
                $array_1,
                $array_2,
                $array_3.$array_4.$array_5.$array_6.$array_7,
                $array_8,
                $array_9
            );
Avatar billede inteeeL Nybegynder
15. februar 2012 - 12:59 #16
En lidt forenklet måde:

<?php

$file = "test.txt";
$openFile = fopen( $file, 'r');
$getContent = fread( $openFile, filesize( $file));
$explodeLines = explode("\n", $getContent);

foreach( $explodeLines as $line) {
    $line = trim( $line, "|");
    $array = explode("|", $line);
   
    $buildValue = '';
    foreach( $array as $key => $value) {
        $eraseElement = (($value == '') || ( $value == '_') ? true : false);
        if(( $key > 4) && ( $key < 9)) {
            if( $key != 8) {
                $buildValue .= ( !$eraseElement ? $value.'/' : '');
                unset($array[$key]);
            }
            else {
                $buildValue .= ( !$eraseElement ? $value : '');
                if( end( str_split( $buildValue)) == '/') {
                    $buildValue = substr( $buildValue, 0, sizeof( str_split( $buildValue))-1);
                }
                $array[$key] = $buildValue;
                if( empty( $array[$key])) {
                    unset($array[$key]);
                }
            }
        }
    }

    $array = array_values( $array);

    echo '<pre>';
    var_dump($array);
    echo '</pre>';   
}

fclose( $openFile);

?>


Det skulle gøre det for dig :-)
Avatar billede inteeeL Nybegynder
15. februar 2012 - 19:06 #17
Grunden til at det ikke virkede med den anden kode var, at vi unsat/fjernede elementet, hvis det var tomt eller indeholdt underscore (_). Problemet er, at der, hvor $array[8] er tom eller lig med "_", når vi aldrig ned til den del, hvor den egentlige sammentrækning af elementerne sker. Jeg har i stedet undladt at fjerne elementet og i stedet valideret med $eraseElement, som returnerer, om elementet er tomt/indeholder "_" eller ej.

Jeg håber ovenstående er til at forstå, ellers må du spørge. Hvis du vælger at bruge din egen kode, skal du blot ignorere denne kommentar.
Avatar billede expnet Seniormester
03. marts 2012 - 11:26 #18
inteeeL -> ligger du ikke et svar du har være til stor hjælp, så stort tak her fra
Avatar billede inteeeL Nybegynder
04. marts 2012 - 17:57 #19
Det var så lidt, svar :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester