Jag har ett problem jag inte får till...
Jag vill göra en array som ser ut som följer:
"Namn1","1","2"
"Namn2","3","1"
eller
"Namn1" => "1","2"
"Namn2" => "3","1"
Självklart ska den initieras "on the fly" tom och så ska jag mata in värden senare i koden...
Någon som har tips? Jag har kört fast.
MatteMedlem sedan aug. 20002 975 inlägg Att initiera den tom gör du med
$array = array();
Annars använder du principen:
$array[] = array("Namn1", "1", "2");
$array[] = array("Namn2", "3", "1");
Eller enligt ditt andra alternativ:
$array['Namn1'] = array("1", "2");
$array['Namn2'] = array("3", "1");
Okej tack!
Men min stackars hjärna vägrar lösa mitt problem... ;)
Jag visar mer av det:
Antalet personer är mellan 1-6 varje person ska ha två värden knutna till sig på detta sätt.
Denna gång är det tre personer.
Om arrayen ser ut så här:
1,2,3,4,5,6
Så kan under första svängen varje person:
"person1","1",""
"person2","2",""
"person3","3",""
Nästa sväng:
"person1","1","4"
"person2","2","5"
"person3","3","6"
Hur får jag till denna inmatning och hur läser jag ur saker ur denna array?
MatteMedlem sedan aug. 20002 975 inlägg Vad menar du med nästa sväng?
Ska det in en ny omgång med två värden?
Isåfall:
// Omgång 1
$array['person1'][] = array("1", "");
$array['person2'][] = array("2", "");
$array['person3'][] = array("3", "");
// Omgång 1
$array['person1'][] = array("1", "4");
$array['person2'][] = array("2", "5");
$array['person3'][] = array("3", "6");
// Exempel på att hämta
echo $array['person3'][1][1]; // Skriver ut "6"
Eller ska du endast ändra uppgifterna mellan omgångarna?
// Omgång 1
$array['person1'] = array("1", "");
$array['person2'] = array("2", "");
$array['person3'] = array("3", "");
// Omgång 1
$array['person1'] = array("1", "4");
$array['person2'] = array("2", "5");
$array['person3'] = array("3", "6");
echo $array['person2'][0]; // Skriver ut "2"
För att se hur arrayerna är uppbyggda kan du använda dig av:
echo "<pre>";
print_r($array);
echo "</pre>";
I uppbyggnaden av arrayerna menar jag med "sväng" att jag kör en while/for sats för att fylla arrayen med värden.
Men allt ska köras dynamiskt... det är det som ställer till det för mig.
Säg till om jag begär för mycket. :)
Som så här:
Med en while/for sats fyller jag på arrayen, alla värden är dynmiska.
Denna gång är det tre personer nästa gång kan det vara 4 eller 5.
arrayen med värden ser ut som följer:
$person = array("person1","person2","person3");
$array=array(1,2,3,4,5,6);
$b=0;
$pos = 0;
for($a=0;$a<count($array);$a++)
if($pos==0)
$array[person[$b]][] = array($array[$a], "");
else
$array[person[$b]][] = array("", $array[$a]); // Vid denna inmatning är värde 1 orört? eftersom det redan finns info i den positionen hur skyddar jag den?
$b++;
if($b==3)
{
$b=0;
$pos++;
}
Jag tror det blev rätt....
MatteMedlem sedan aug. 20002 975 inlägg Då är det det första alternativet du bör använda.
Behöver du hjälp med att tillämpa det får du nog visa din while/for-sats.
MatteMedlem sedan aug. 20002 975 inlägg Har läst din redigering, men är tveksam om jag förstår vad du vill få ut.
Ska person1 få 1 och 4, person 2 4 och 6 o.s.v. ?
Vad ska då hända om det fanns tre värden till i siffer-arrayen ?
Person 1 ska få 1 och 4, person 2 ska få 2 och 4 osv. upp till 6 personer.
Sifferarrayen kommer alltid vara mycket längre än behovet så det problemet kommer aldrig att uppstå.
förtydling, maximalt kommer det bli så här:
person1 - 1 7
person2 - 2 8
person3 - 3 9
person4 - 4 10
person5 - 5 11
person6 - 6 12
MatteMedlem sedan aug. 20002 975 inlägg Vet inte om jag förstått rätt, men som jag förstår det så ska arrayen första värde vara det värde som träffas på första gången, och det andra (sista) värdet ska vara det värde som träffas på sist.
Testa då det här:
$person = array("person1", "person2", "person3");
$array = array(1, 2, 3, 4, 5, 6);
$c_pers = count($person);
$c_arr = count($array);
$result = array();
for ($i=0; $i<$c_arr; $i++) {
if (empty($result[$i % $c_pers])) {
$result[$person[$i % $c_pers]] = array($array[$i], '');
} else {
$result[$person[$i % $c_pers]][1] = $array[$i];
}
}
// Titta vad resultatet blev. Endast för test
echo "<pre>";
print_r($result);
rcho "</pre>";
Det jag får ut av detta är:
Array
(
[] => Array
(
[0] => KD32443-3 // Min värden...
[1] =>
)
)
Jag har försökt titta igenom din kod men kan inte riktigt se felet men det verkar som om den kör den "sanna" delen av if satsen hela tiden och aldrig kommer till else delen.
Jag provade att lägga till mina värden i $array i din kod resultatet blir då, min array är runt 100 poster:
Array
(
[person1] => Array
(
[0] => KD32443-3 // Min värden...
[1] =>
)
[person2] => Array
(
[0] => KD32442-3 // Min värden...
[1] =>
)
[person3] => Array
(
[0] => KD32441-3 // Min värden...
[1] =>
)
)
Den plockar också de tre sista värdena ur arrayen...
Det som till en början ska plockas ut när det gäller tre personer är de sex första värderna ur $array person1 ska ha värde 1 och 3, person 2 2 och 4 och person3 3 och 6.
aasahMedlem sedan mars 20034 471 inlägg
alnö_mattias skrev:
....förtydling, maximalt kommer det bli så här:
person1 - 1 7
person2 - 2 8
person3 - 3 9
person4 - 4 10
person5 - 5 11
person6 - 6 12
Just detta får du med:
$knasigArray = array(); // ;-)
$antalPers = 6;
for ($i = 1; $i <=$antalPers; $i++) {
$knasigArray['person'.$i] = array($i, $i+$antalPers);
}
Om detta inte är vad du är ute efter, så skulle det hjälpa mycket mer om du beskrev vad som gäller generellt än för ett visst fall.
Jag tror du missförstod mig. :)
Slut resultatet jag vill ha är:
Exempel 3 personer
"Person1" => "1","4"
"Person2" => "2","5"
"Person3" => "3","6"
Det hela systemet handlar om arbetsfördelning mellan anställda.
Numren jag använder är arbetsordernummer, de ska alltså jämt delas mellan personerna.
Därav de resultat jag vill ha men inte får fram.
Din kod får jag inte att fungera aasah. :)
aasahMedlem sedan mars 20034 471 inlägg Min kod ger en multiarray med exakt innehåll:
$knasigArray[person1][0] = 1
$knasigArray[person1][1] = 7
...
$knasigArray[person6][0] = 8
$knasigArray[person6][1] = 12
Om det är 3 personer sätter du ju bara $antalPers = 3 i stället.
Vad är det som inte funkar? :q
Hmmm så fick inte jag.
Jag har en kod som nu tilldelar som jag själv vill men (!) jag får den inte att tilldela värde två i position 1.
Så här ser print_r ut efter min kod:
Array ( [Person1] => Array ( [0] => K23432 [1] => ) [Person2] => Array ( [0] => K13234 [1] => ) [Person3] => Array ( [0] => K98342 [1] => ) [Person3] => Array ( [1] => Array ( [0] => K89723 [1] => ) ) )
Som ni ser får jag inte in värden i position 1. Varför?
Kod:
while($delning<$arbOrd)
{
if($anstalld==$p)
{
$anstalldasOrderar["Person".$anstlld][1] = array($ordrar[$delning],'');
}
else
{
$anstalldasOrderar["Person".$anstlld] = array($ordrar[$delning],'');
$anstalld++;
}
$delning++;
}
aasahMedlem sedan mars 20034 471 inlägg
- När du postar PHP-kod, använd
[ PHP]koden (fast utan mellanslag mellan '[' och 'PHP]' ), det gör programmet MYCKET lättare att läsa. Jämför:
$knasigArray = array(); // ;-)
$antalPers = 6;
for ($i = 1; $i <=$antalPers; $i++) {
$knasigArray['person'.$i] = array($i, $i+$antalPers);
}
med
$knasigArray = array(); // ;-)
$antalPers = 6;
for ($i = 1; $i <=$antalPers; $i++) {
$knasigArray['person'.$i] = array($i, $i+$antalPers);
}
- Tillbaka till problemet.
Eftersom jag inte vet vad som döljer sig bakom dina variabelnamn kanske jag missförstår. Men, jag tycker att din tilldelningsmetod ser rätt skum ut.
Om du lagrar alla arbetsordrar i $orders, och alla personer i $workers till att börja med, på formen:
$orders = array('K23432', 'K13234', ....);
$workers = array('Kalle', 'Pelle', .....);
Eller person1, person2 om du inte vet namnen. Då borde du få ut en lista på allt var person ska göra på följande vis.
$worklist = array();
//Varje person får en än så länge tom lista
foreach ($workers as $wNr => $name) {
$worklist[$name] = array();
}
$antalW = count($workers);
$wNr = 0;
//Går igenom alla orders och tilldelar successivt till en person
//i taget. När alla fått en order, får första personen sin andra osv...
foreach ($orders as $ordNr => $ordID) {
array_push($worklist[$workers[$wNr]], $ordID);
if ($wNr == $antalW) $wNr = 0; //Alla har fått, nästa runda
else $wNr++;
}
Exempel du har två personer Kalle och Pelle och fem ordrar: K1, K2, ... K5.
I slutändan får du då:
$worklist['Kalle'] är lika med (0 => K1, 1 => K3, 2 => K5)
$worklist['Pelle'] är lika med (0 => K2, 1 => K4)
sl0kMedlem sedan maj 2005562 inlägg vet inte om du har löst det än men tror det är nåt sånt här du vill ha ?
$array = array();
$antalPers = 3;
/* Första varvet */
for ($i=1; $i<=$antalPers; $i++)
$array['person' . $i] = array($value1);
/* Andra varvet */
for ($i=1;$array['person' . $i];$i++)
$array['person' . $i][] = $value2;
Array
(
[person1] => Array
(
[0] => value1
[1] => value2
)
[person2] => Array
(
[0] => value1
[1] => value2
)
[person3] => Array
(
[0] => value1
[1] => value2
)
)
sl0k - vackert! Precis vad jag behövde... till och med snyggare än den lösning jag själv lyckats ta fram... denna ska jag använda. :)