gesplitste reeks in meerdere arrays?

ik heb een string zoals deze

$sitesinfo = 'site 1 titles-example1.com/
site 2 titles-example2.com/
site 3 titles-example3.com/
site 4 titles-example4.com/
site 5 titles-example5.com/';

Ik heb lijnen in zo'n array opgesplitst als deze

$lines = explode("/",$sitesinfo);

dan terwijl ik loop kreeg ik elke regel zonder problemen in een array-object wat ik moet doen om elke regel in 2 stukken te splitsen en elk stuk in een array toe te voegen, zodat het resultaat als volgt is

$titles = array("site 1 titles","site 2 titles","site 3 titles","site 4 titles","site 5 titles");
$domains = array("example1.com","example2.com","example3.com","example4.com","example5.com");

dus ik kan ze in script gebruiken

ik deed veel pogingen maar faalde :(

Bedankt

0

3 antwoord

Wat denk je hiervan:

foreach ($lines as $line) {
  $t = explode('-', trim($line), 2);
  if (count($t) < 2) {
    echo "Failed to parse the line $line";
    continue;
  }
  $titles[] = $t[0];
  $domains[] = $t[1];
}

Uitleg: elke regel wordt gesplitst door '-' in precies 2 delen (als er minder is, is dat een fout - de regel bevat geen '-' en moet dus helemaal niet worden verwerkt). Het eerste deel wordt in array $ titles geplaatst, het tweede deel in $ domains .

2
toegevoegd
Trouwens, de domeinen die het OP wenste te zien (in zijn voorbeeld) zijn zonder het '/' -symbool ... Nou, wat dan ook.
toegevoegd de auteur raina77ow, de bron
toegevoegd de auteur raina77ow, de bron
sorry voor het downvote, maar ik vind deze oplossing niet leuk omdat het ervan uitgaat dat het bij "/" explodeert zoals wat OP had, en vandaar gaat. Wat gebeurt er wanneer een URL niet eindigt in "/"? Het zou mislukken als de URL daar niet in eindigt, en zelfs als dat wel het geval is, wordt het niet teruggezet omdat het is deel van de URL. Minimaal moet dit worden geëxplodeerd bij het regeleinde (als je dit toevoegt aan je bericht, dan geef ik je een reactie terug :))
toegevoegd de auteur Crayon Violent, de bron
nou je hebt niet laten zien waar $ lines vandaan komt, dus er wordt van uitgegaan dat je je code bent begonnen waar de OP was gebleven. Als dat niet is wat $ lines in uw code vertegenwoordigt, laat dan zien waaruit $ lines komt.
toegevoegd de auteur Crayon Violent, de bron
Excuseer me, maar u bood geen complete oplossing. Uw code begint met de aanname dat $ lines een array van rijen is van de $ sitesinfo van OP. Omdat een deel van het probleem een ​​enkele reeks betreft, slaat uw code ofwel a) een stap over, of b) begint waar OP is gebleven met die ontploffing. In plaats van je slipje in een prop te krijgen over dit feit, repareer je je code en krijg je je stem terug. Het is zo simpel.
toegevoegd de auteur Crayon Violent, de bron

Splits eerst de string in elke regel (door het regel eindigteken).

Splits vervolgens elke regel in twee delen bij de eerste - en voeg die onderdelen toe aan het resultaat. U kunt later elk onderdeel een eigen naam geven:

Voorbeeld/ Demo :

$lines = explode("\r\n", $sitesinfo);
$r = array(null, null);
foreach($lines as $line) {
    list($r[0][], $r[1][]) = explode("-", $line, 2) + array(1 => NULL);
}
list($titles, $domains) = $r;
unset($r);

Of de regex-variant ( Demo ):

preg_match_all('~([^-]+)-(.*)~', $sitesinfo, $matches);
list(, $titles, $domains) = $matches;
unset($matches);

Resultaat:

array(5) {
  [0]=>
  string(13) "site 1 titles"
  [1]=>
  string(13) "site 2 titles"
  [2]=>
  string(13) "site 3 titles"
  [3]=>
  string(13) "site 4 titles"
  [4]=>
  string(13) "site 5 titles"
}
array(5) {
  [0]=>
  string(13) "example1.com/"
  [1]=>
  string(13) "example2.com/"
  [2]=>
  string(13) "example3.com/"
  [3]=>
  string(13) "example4.com/"
  [4]=>
  string(13) "example5.com/"
}
1
toegevoegd
@ raina77ow: Ja, kan handig zijn, nog een voorbeeld toevoegen.
toegevoegd de auteur hakre, de bron
1. ) Ik gebruik zelden lijst -operator (kan zijn omdat het te vergelijkbaar is, maar niet helemaal naar ($ foo, @bar ...) = Perl-constructie, en ik ben echt bang voor bugs die kunnen worden geïntroduceerd door die niet-vrij-gelijkenis), maar ik geniet ervan anderen te zien die het gebruiken. )
toegevoegd de auteur raina77ow, de bron

regex alternatief:

$sitesinfo = 'site 1 titles-example1.com/
site 2 titles-example2.com/
site 3 titles-example3.com/
site 4 titles-example4.com/
site 5 titles-example5.com/';

preg_match_all('~([^-]+)-(.*)~',$sitesinfo,$matches);
$titles = array_map('trim',$matches[1]);
$domains = array_map('trim',$matches[2]);
1
toegevoegd