Optimaximal
Optimaximal

Reputation: 555

Str_replace inside mutlidimensional array

I have a multidimensional array as follows, which is a PHP array of shoe sizes and their conversions...

$size_array = array(
"M"=>array(
    '6'=>   array('uk'=>'6','eu'=>'39.5','us'=>'7'),
    '6H'=>  array('uk'=>'6.5','eu'=>'40','us'=>'7.5'),
    '7'=>   array('uk'=>'7','eu'=>'40.5','us'=>'8'),
    '7H'=>  array('uk'=>'7.5','eu'=>'41','us'=>'8.5'),
    '8'=>   array('uk'=>'8','eu'=>'42','us'=>'9'),
    '8H'=>  array('uk'=>'8.5','eu'=>'42.5','us'=>'9.5'),
    '9'=>   array('uk'=>'9','eu'=>'43','us'=>'10'),
    '9H'=>  array('uk'=>'9.5','eu'=>'44','us'=>'10.5'),
    '10'=>  array('uk'=>'10','eu'=>'44.5','us'=>'11'),
    '10H'=> array('uk'=>'10.5','eu'=>'45','us'=>'11.5'),
    '11'=>  array('uk'=>'11','eu'=>'46','us'=>'12'),
    '11H'=> array('uk'=>'11.5','eu'=>'46.5','us'=>'12.5'),
    '12'=>  array('uk'=>'12','eu'=>'47','us'=>'13'),
    '12H'=> array('uk'=>'12.5','eu'=>'48','us'=>'13.5'),
    '13'=>  array('uk'=>'13','eu'=>'48.5','us'=>'14')
    ),
"F"=>array(
    '3'=>   array('uk'=>'3','eu'=>'35.5','us'=>'5'),
    '3H'=>  array('uk'=>'3.5','eu'=>'36','us'=>'5.5'),
    '4'=>   array('uk'=>'4','eu'=>'37','us'=>'6'),
    '4H'=>  array('uk'=>'4.5','eu'=>'37.5','us'=>'6.5'),
    '5'=>   array('uk'=>'5','eu'=>'38','us'=>'7'),
    '5H'=>  array('uk'=>'5.5','eu'=>'38.5','us'=>'7.5'),
    '6'=>   array('uk'=>'6','eu'=>'39','us'=>'8'),
    '6H'=>  array('uk'=>'6.5','eu'=>'39.5','us'=>'8.5'),
    '7'=>   array('uk'=>'7','eu'=>'40','us'=>'9'),
    '7H'=>  array('uk'=>'7.5','eu'=>'41','us'=>'9.5'),
    '8'=>   array('uk'=>'8','eu'=>'41.5','us'=>'10'),
    '8H'=>  array('uk'=>'8.5','eu'=>'42.5','us'=>'10.5'),
    '9'=>   array('uk'=>'9','eu'=>'43','us'=>'11'),
    '9H'=>  array('uk'=>'9.5','eu'=>'43.5','us'=>'11.5'),
    '10'=>  array('uk'=>'10','eu'=>'44','us'=>'12')
    )
);

The array is part of a function that returns the conversions based on a supplied size and gender (i.e. SizeConvert('M','6') returns Array ([uk] => 6, [eu] => 39.5,[us] => 7)).

I want to extend the function to allow the passing of a value which will return the array results with any .5 values replaced with ½ (or ½) (i.e. SizeConvert('M','6','Y') returns Array ([uk] => 6, [eu] => 39½,[us] => 7))

How do I make str_replace (or a more appropriate command) iterate over the array and replace the values?

I've tried something like str_replace(".5", "&frac12", $size_array) but I guess that's not working as it's only looking at the initial array, not the sub-arrays.

Upvotes: 0

Views: 45

Answers (2)

El_Vanja
El_Vanja

Reputation: 3983

You are trying to apply this to a multidimensional array without real reason. If you have your SizeConvert function ready and returning a one dimensional array, simply apply the transformation before returning the value:

function SizeConvert(/* other parameters */, bool $convertOneHalf) {
    $match = ... // your code to find the match
    return $convertOneHalf
        ? str_replace('.5', '½', $match)
        : $match;
}

Based on the boolean value of the parameter that dictates whether the conversion should be applied, we either return the modified or the unmodified result through the ternary.

Upvotes: 1

Tan Yi Jing
Tan Yi Jing

Reputation: 303

Do not overthink it and use a for loop to loop through all the elements in the array and use an if...else... to check for 0.5

if($array[index]=="0.5") { 
    $array[index]="½"; 
} else {
    $array[index]=str_replace(".5", "½", $array[index]);
}

I coded up a simple code, it's not exactly the answer to your question but u can use the logic behind it. The code below will change all the 0.5 in the array to 1⁄2 but since u already acquire the data, there is no need to have so much nested-loop, just 1 level of the loop to loop through all ur elements in your array is enough.

<?php
$size_array = array(
    "M" => array(
        '6' => array(
            'uk' => '6',
            'eu' => '39.5',
            'us' => '7'
        ) ,
        '6H' => array(
            'uk' => '6.5',
            'eu' => '40',
            'us' => '7.5'
        ) ,
        '7' => array(
            'uk' => '7',
            'eu' => '40.5',
            'us' => '8'
        )
    ) ,
    "F" => array(
        '3' => array(
            'uk' => '3',
            'eu' => '35.5',
            'us' => '5'
        ) ,
        '3H' => array(
            'uk' => '3.5',
            'eu' => '36',
            'us' => '5.5'
        ) ,
        '4' => array(
            'uk' => '4',
            'eu' => '37',
            'us' => '6'
        )
    )
);

foreach ($size_array as $firstLevel)
{
    foreach ($firstLevel as $secondLevel)
    {
        foreach ($secondLevelas $values)
        {
            if ($values== "0.5")
            {
                echo $values= "&frac12;";
            }
            else
            {
                echo $values= str_replace(".5", "&frac12;", $values);
            }
        }
    }
}
?>

Upvotes: 1

Related Questions