سؤال

أحتاج إلى الانفجار بواسطة "،" ثم ":". سهل بما فيه الكفاية ...

$alttitle = "35:title1,36:title2, 59:title5"
$replacetitles = explode(",",$alttitle);
for ($i = 0 ; $i < count($replacetitles) ; $i++) {
   $replacetitle[] = explode(":", $replacetitles[$i]);
}

الذي ينتج ...

صفيف ([0] => صفيف ([0] => 35 [1] => title1) [1] => صفيف ([0] => 36 [1] => title2) [2] => صفيف ([[[[ 0] => 59 [1] => title5))

... لكن الرقم 35،36،59 فريد من نوعه ، لذا أريد أن يصبح هذا المفتاح للمصفوفة؟

صفيف ([35] => title1 [36] => title2 [59] => title5)

هل كانت مفيدة؟

المحلول

ببساطة قم بتعيينه أثناء الحلقات:

$alttitle = "35:title1,36:title2, 59:title5"
$tmptitles = explode(",",$alttitle);

$replacetitle = array();
foreach($tmptitles as $tmptitle) {
   $tmparr = explode(":", trim($tmptitle));
   $replacetitle[intval($tmparr[0])] = trim($tmparr[1]);
}

مع ما سبق ، ستقوم بإنشاء صفيفك الحد الأدنى من التكرارات.

نصائح أخرى

هنا آخر ولكن ربما البديل المبالغة.

if (!preg_match_all('/([0-9]+)\s*:\s*([^,]+)/', $alttitle, $matches)) {
    //not valid   
}

$array = array_combine($matches[1], $matches[2]);
print_r($array);

ها هو رأيي

$alttitle  = "35:title1,36:title2, 59:title5";

$entries   = preg_split( "/ *, */", $alttitle );
$flattened = array();

for ( $i = 0, $l = count( $entries ); $i < $l; $i++)
{
  list( $index, $value ) = explode( ':', $entries[$i] );
  $flattened[$index] = $value;
}

print_r( $flattened );

تعديل

الآن مع اختبار السرعة مقابل الانفجار/القطع

$testData = implode( ',', array_fill( 1, 10000, "a,b, c,  d" ) );

$start = microtime( true );
$entries = explode( ",", $testData );
$ouptput = array();

for ( $i = 0, $l = count( $entries ); $i < $l; $i++ )
{
  $output[] = trim( $entries[$i] );
}
echo "explode/trim test took: ", ( microtime( true ) - $start ), ' seconds<br>';

unset( $start, $entries, $output );

$start = microtime( true );
$entries = preg_split( "/ *, */", $testData );
$ouptput = array();

for ( $i = 0, $l = count( $entries ); $i < $l; $i++ )
{
  $output[] = $entries[$i];
}
echo "preg_split test took: ", ( microtime( true ) - $start ), ' seconds<br>';

بعد الكود الخاص بك يمكنك إضافة هذا:

$ar = array();
for ($i = 0; $i < count($replacetitle); $i++) {
    $ar[$replacetitle[$i][0]] = $replacetitle[$i][1];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top