Gå til innhold

Hjelp til array funksjoner


Anbefalte innlegg

Hei,

 

Har et array som er bygd opp slik:

 

$array = array('Gruppe' => array(array('streng' => array('understreng', 'understreng2'), 'streng2' => array('understreng3', 'understreng4')), array('streng3' => array('understreng5', 'understreng6'), 'streng4' => array('understreng7', 'understreng8'))));

 

Skal se slik ut: (mister kanskje mellomrommene nå men..)

Array
(
[Gruppe] => Array
	(
		[0] => Array
			(
				[streng] => Array
					(
						[0] => understreng
						[1] => understreng2
					)

				[streng2] => Array
					(
						[0] => understreng3
						[1] => understreng4
					)

			)

		[1] => Array
			(
				[streng3] => Array
					(
						[0] => understreng5
						[1] => understreng6
					)

				[streng4] => Array
					(
						[0] => understreng7
						[1] => understreng8
					)

			)

	)

)

 

 

 

Det jeg ønsker er å sjekke om $array['gruppe'][*]['streng'] finnes og hente ut "*" altså det tallet vet jeg ikke (kan være alt fra 0 til 10 000 egentlig).

 

Gjør det nå med en loop etter utallige forsøk på array_search, men da må jeg vite innholdet i hver streng, noe jeg heller ikke vet.

 

Det eneste jeg vet er at $array['gruppe'] finnes og at $array['gruppe'][(int)] finnes det mange av og at det muligens inni en av de finnes en som heter 'streng'.

 

Jeg vil finne den (int) mellom ['gruppe'] og ['streng'] og om det finnes noen ['gruppe'][(int)]['streng'] i det hele tatt..

 

 

Noen som klarer å løse det uten å bruke dyre loops? Eller, noen som klarer å løse det på en effektiv måte? Må finne maaange sånne (int) mellom ['gruppe'] og ['streng'] og det koster dyrt i scriptet mitt.

 

 

Takk for alle svar :)

Lenke til kommentar
Videoannonse
Annonse

Hmm.. Jeg skjønte ikke helt hvordan det skulle løse problemet? Jeg må jo da vite (int) for å kunne legge det inn i det array ditt? eller er det noe som jeg lett kan finne ut? kommer til å ha flere ['gruppe'] arrays og det skal være mulig å slette ['streng'], eller flytte de opp og ned i forhold til f.eks ['streng2'].. (strengene vil alltid være unike innenfor sin gruppe)

 

Har disse metodene i forbindelse med behandling av arrayet:

 

add($gruppe, $streng, $understreng)

addBefore($gruppe, $streng, $eksisterende_streng, $understreng)

addAfter($gruppe, $streng, $eksisterende_streng, $understreng)

remove($gruppe, $streng)

 

hvor eksisterende_streng er en streng som allerede ligger i arrayet... rekkefølgen er den (int)'en jeg leter etter Eller kan vel kalle det key i $array['gruppe'] arrayet..

 

 

Er det bare jeg som ikke er helt med og at løsningen din ordner alt?:p

Lenke til kommentar

Poenget mitt var at du vet streng og kanskje gruppe, men ikke int. Derfor bør du gruppere det etter det du vet hvis du skal søke flere ganger i arrayet.

 

foreach ($array as $gruppe => $subarray) {
 foreach ($subarray as $int => $strenger) {
foreach ($strenger as $streng => $understrenger) {
  $perStreng[$streng][$gruppe] = $int;
}
 }
}

$search = 'streng4';
if (isset($perStreng[$search])) {
 echo "Streng $search er i følgende gruppe/int med understrenger:\n";
 foreach ($perStreng[$search] as $gruppe => $int) {
echo "$gruppe/$int '" . implode("', '", $array[$gruppe][$int][$search]) . "'.\n";
 }
} else {
 echo "Kunne ikke finne $search!\n";
}

 

Det blir mer å holde orden på, men kan gjøres automagisk av funksjonene dine.

 

Egentlig burde du ha dette som et objekt, eller kanskje i en database.

Endret av OIS
Lenke til kommentar

Gir dette deg det du ønsker?

<?php
$array = array('Gruppe' => array(array('streng' => array('understreng', 'understreng2'), 'streng2' => array('understreng3', 'understreng4')), array('streng3' => array('understreng5', 'understreng6'), 'streng4' => array('understreng7', 'understreng8'))));
$integerKeysSomInneholderEnKeySomHeterStreng = array();
foreach ( $array['gruppe'] as $integerKey => $subArray ) {
	if ( isset( $subArray['streng'] ) ) {
		$integerKeysSomInneholderEnKeySomHeterStreng[] = $integerKey;
	}
}
echo '<pre>';
print_r( $integerKeysSomInneholderEnKeySomHeterStreng );
die();

Lenke til kommentar

1. Jeg leser første post som at det kun er én gruppe.

2. Jeg leste som om at det bare var én streng, men er det flere blir det selvsagt tyngre.

 

Det eneste jeg vet som kan være veldig raskt i en slik sak som dette er å i stedet for å bruke et hierarki bruke en relasjonsdatabase eller å bruke xpath.

Lenke til kommentar

har nå testet litt og det virker som JohndoeMAKT sin funker best. Ikke noe problem med flere grupper..

 

Den er egentlig ganske lik den jeg hadde, men tror det er den beste måten å gjøre det på. Og den var i tillegg enda raskere enn den jeg brukte fra før. :D

 

Testet OIS sin også, hvis jeg skulle kjøre begge løkkene for hver string ville den vært mye tregere, men setter jeg den løkken utenfor blir den litt raskere enn JohndoeMAKT sin(snakk om ca 8%), men siden den funksjonen skal kjøres så mange ganger og det arrayet lages ved hjelp av metoder i en klasse vil det derfor ikke være mulig å sette den første løkken utenfor da arrayet vil forandre seg hele tiden..

 

 

Kan selvfølgelig lage det arrayet som den første løkken lager inni klassen, men det gjør den faktisk tregere enn hvis jeg bare bruker JohndoeMAKT sin... (mulig jeg som driter meg ut, men sånn ble det..)

 

Takk skal dere ha begge to! :)

 

Dersom noen skulle finne en enda bedre måte å gjøre det på er de hjertelig velkommen til å komme med en bedre løsning :)

 

 

Har dere forslag som løser det samme med et annet design på arrayet (som gir bedre ytelse) er det bare å skrike ut:) (trenger forsåvidt ikke være et array, kan godt være et objekt/flere, men det må kunne brukes uten databaser/flatfile, altså alt må være inni en php fil.

 

Krav er bare at jeg skal kunne hente ut arrayet til alle strenger i en gruppe, arrayet til en bestemt streng og at strengene skal være indeksert i forhold til gruppen og strengene skal vise til et annet array som kan inneholde alt mulig (Det er en feil i det arrayet som jeg bruker som eksempel, det skal ALDRI være flere strenger per key/index (int))

 

Må støtte disse metodene:

add($gruppe, $streng, array())

addBefore($gruppe, $streng, $eksisterende_streng, array())

addAfter($gruppe, $streng, $eksisterende_streng, array())

remove($gruppe, $streng)

Lenke til kommentar

Dette er løsningen min for å finne key:

private static function _getKey($group, $string)
{

foreach (self::$_array[$group] as $key => $array) {

	if (isset($array[$string]))  return $key;

}
}

 

Slik legges det til nye strenger:

public static function add($group, $string, array $sub_array)
{

if (!isset(self::$_array[$group])) {

	self::$_array[$group] = array();

}
elseif (self::_getKey($group, $string) !== false || !isset($sub_array)) {

	return false;

}


self::$_array[$group][] = array($string => $sub_array);

return true;

}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...